about_Splatting
Krátký popis
Popisuje, jak pomocí splattingu předat parametry příkazům v PowerShellu.
Dlouhý popis
Splatting je metoda předání kolekce hodnot parametrů příkazu jako jednotky. PowerShell přidruží každou hodnotu v kolekci k parametru příkazu. Splatted hodnoty parametrů jsou uloženy v pojmenovaných splatting proměnných, které vypadají jako standardní proměnné, ale začínají symbolem At (@
) místo znaku dolaru ($
). Symbol At říká PowerShellu, že předáváte kolekci hodnot místo jedné hodnoty.
Splatting zkracuje a usnadňuje čtení příkazů. Hodnoty splattingu můžete použít v různých voláních příkazů a pomocí splattingu předávat hodnoty parametrů z $PSBoundParameters
automatické proměnné do jiných skriptů a funkcí.
Počínaje windows PowerShellem 3.0 můžete také použít splatting k reprezentaci všech parametrů příkazu.
Syntaxe
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
Pokud chcete zadat hodnoty parametrů pro poziční parametry, ve kterých se názvy parametrů nevyžadují, použijte syntaxi pole. Pokud chcete zadat páry názvu a hodnoty parametru, použijte syntaxi tabulky hash. Splattovaná hodnota se může zobrazit kdekoli v seznamu parametrů.
Při dělení nemusíte k předávání všech parametrů použít tabulku hash ani pole. Některé parametry můžete předat pomocí splattingu a předat jiné podle pozice nebo názvu parametru. V jednom příkazu můžete také splatovat více objektů, abyste pro každý parametr nepředáli více než jednu hodnotu.
Od PowerShellu 7.1 můžete přepsat splattovaný parametr explicitním definováním parametru v příkazu.
Splatting with hash tables
Ke spárování názvu parametru a hodnoty použijte tabulku hash. Tento formát můžete použít pro všechny typy parametrů, včetně pozičních parametrů a parametrů přepínače. Poziční parametry musí být přiřazeny názvem.
Následující příklady porovnávají dva Copy-Item
příkazy, které zkopírují Test.txt soubor do Test2.txt souboru ve stejném adresáři.
První příklad používá tradiční formát, ve kterém jsou zahrnuty názvy parametrů.
Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf
Druhý příklad používá splatting tabulky hash. První příkaz vytvoří tabulku hash párů parametr-name a parametr-value a uloží ji do $HashArguments
proměnné. Druhý příkaz používá $HashArguments
proměnnou v příkazu s dělením. Symbol At (@HashArguments
) nahradí znak dolaru ($HashArguments
) v příkazu.
Chcete-li zadat hodnotu parametru WhatIf switch, použijte $True
nebo $False
.
$HashArguments = @{
Path = "test.txt"
Destination = "test2.txt"
WhatIf = $true
}
Copy-Item @HashArguments
Poznámka:
V prvním příkazu symbol At (@
) označuje tabulku hash, nikoli splattovanou hodnotu. Syntaxe pro tabulky hash v PowerShellu je: @{<name>=<value>; <name>=<value>; ...}
Splatting with arrays
Hodnoty pozičních parametrů, které nevyžadují názvy parametrů, použijte matici. Hodnoty musí být v poli v pořadí pozice.
Následující příklady porovnávají dva Copy-Item
příkazy, které zkopírují Test.txt soubor do Test2.txt souboru ve stejném adresáři.
První příklad používá tradiční formát, ve kterém jsou názvy parametrů vynechány. Hodnoty parametrů se v příkazu zobrazí v pořadí pozice.
Copy-Item "test.txt" "test2.txt" -WhatIf
Druhý příklad používá dělení polí. První příkaz vytvoří pole hodnot parametrů a uloží ho $ArrayArguments
do proměnné. Hodnoty jsou v poli v pořadí pozice. Druhý příkaz používá $ArrayArguments
proměnnou v příkazu v splattingu. Symbol At (@ArrayArguments
) nahradí znak dolaru ($ArrayArguments
) v příkazu.
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
Použití parametru ArgumentList
Několik rutin má parametr ArgumentList , který slouží k předání hodnot parametrů do bloku skriptu, který je spuštěn rutinou. Parametr ArgumentList přebírá pole hodnot, které jsou předány do bloku skriptu. PowerShell efektivně používá maticové splatting k vytvoření vazby hodnot na parametry bloku skriptu. Při použití ArgumentList, pokud potřebujete předat pole jako jeden objekt svázaný s jedním parametrem, musíte pole zabalit jako jediný prvek jiného pole.
Následující příklad obsahuje blok skriptu, který přebírá jeden parametr, který je polem řetězců.
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
param([string[]]$words) $words -join ' '
} -ArgumentList $array
V tomto příkladu se do bloku skriptu předá pouze první položka $array
.
Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
param([string[]]$words) $words -join ' '
} -ArgumentList (,$array)
V tomto příkladu je zabalena do pole, $array
aby se celé pole předalo do bloku skriptu jako jeden objekt.
Hello World!
Příklady
Příklad 1: Opakované použití splattovaných parametrů v různých příkazech
Tento příklad ukazuje, jak opakovaně používat splattované hodnoty v různýchpříkazch Příkazy v tomto příkladu používají rutinu k zápisu Write-Host
zpráv do konzoly hostitelského programu. Používá k určení barev popředí a pozadí vrstvení.
Pokud chcete změnit barvy všech příkazů, stačí změnit hodnotu $Colors
proměnné.
První příkaz vytvoří tabulku hash názvů parametrů a hodnot a uloží tabulku hash do $Colors
proměnné.
$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
Druhý a třetí příkazy používají $Colors
proměnnou Write-Host
pro splatting v příkazu. Chcete-li použít znak dolaru $Colors variable
($Colors
) symbolem At (@Colors
).
#Write a message with the colors in $Colors
Write-Host "This is a test." @Colors
#Write second message with same colors. The position of splatted
#hash table does not matter.
Write-Host @Colors "This is another test."
Příklad 2: Předávání parametrů pomocí $PSBoundParameters
Tento příklad ukazuje, jak předat jejich parametry jiným příkazům pomocí splattingu $PSBoundParameters
a automatické proměnné.
Automatická $PSBoundParameters
proměnná je objekt slovníku (System.Collections.Generic.Dictionary), který obsahuje všechny názvy a hodnoty parametrů, které se používají při spuštění skriptu nebo funkce.
V následujícím příkladu $PSBoundParameters
použijeme proměnnou k předání hodnot parametrů skriptu nebo funkci z Test2
funkce do Test1
funkce. Obě volání Test1
funkce z Test2
použití splattingu.
function Test1
{
param($a, $b, $c)
"a = $a"
"b = $b"
"c = $c"
}
function Test2
{
param($a, $b, $c)
#Call the Test1 function with $a, $b, and $c.
Test1 @PSBoundParameters
#Call the Test1 function with $b and $c, but not with $a
Test1 -b $PSBoundParameters.b -c $PSBoundParameters.c
}
Test2 -a 1 -b 2 -c 3
a = 1
b = 2
c = 3
a =
b = 2
c = 3
Příklad 3: Přepsání splattovaných parametrů explicitně definovanými parametry
Tento příklad ukazuje, jak přepsat splatted parametr pomocí explicitně definovaných parametrů. To je užitečné v případě, že nechcete vytvořit novou hashovací tabulku nebo změnit hodnotu v hashovatelné tabulce, kterou používáte ke splatování.
Proměnná $commonParams
ukládá parametry pro vytvoření virtuálních počítačů v East US
umístění. Proměnná $allVms
je seznam virtuálních počítačů, které se mají vytvořit. Projdeme seznam a použijeme $commonParams
k vytvoření jednotlivých virtuálních počítačů parametry. Chceme myVM2
ale vytvořit v jiné oblasti než ostatní virtuální počítače. Místo úprav $commonParams
hashtable můžete explicitně definovat parametr Location , aby New-AzVm
nahradil hodnotu Location
klíče v $commonParams
.
$commonParams = @{
ResourceGroupName = "myResourceGroup"
Location = "East US"
VirtualNetworkName = "myVnet"
SubnetName = "mySubnet"
SecurityGroupName = "myNetworkSecurityGroup"
PublicIpAddressName = "myPublicIpAddress"
}
$allVms = @('myVM1','myVM2','myVM3',)
foreach ($vm in $allVms)
{
if ($vm -eq 'myVM2')
{
New-AzVm @commonParams -Name $vm -Location "West US"
}
else
{
New-AzVm @commonParams -Name $vm
}
}
Příklad 4: Použití více splattovaných objektů v jednom příkazu
V jednom příkazu můžete použít více splattovaných objektů. V tomto příkladu jsou různé parametry definovány v samostatných hashtables. Hashtables se splattují v jednom Write-Host
příkazu.
$a = @{
Message = 'Hello', 'World!'
}
$b = @{
Separator = '|'
}
$c = @{
BackgroundColor = 'Cyan'
ForegroundColor = 'Black'
}
Write-Host @a @b @c
Parametry příkazu Splatting
K reprezentaci parametrů příkazu můžete použít splatting. Tato technika je užitečná při vytváření funkce proxy, tj. funkce, která volá jiný příkaz. Tato funkce je představena ve Windows PowerShellu 3.0.
Pokud chcete parametry příkazu osplatit, použijte @Args
k reprezentaci parametrů příkazu. Tato technika je jednodušší než výčet parametrů příkazu a funguje bez revize, i když se parametry volaného příkazu změní.
Funkce používá automatickou $Args
proměnnou, která obsahuje všechny nepřiřazené hodnoty parametrů.
Například následující funkce volá rutinu Get-Process
. V této funkci @Args
představuje všechny parametry rutiny Get-Process
.
function Get-MyProcess { Get-Process @Args }
Při použití Get-MyProcess
funkce se předají @Args
všechny nepřiřazené parametry a hodnoty parametrů, jak je znázorněno v následujících příkazech.
Get-MyProcess -Name PowerShell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
463 46 225484 237196 719 15.86 3228 powershell
Get-MyProcess -Name PowerShell_Ise -FileVersionInfo
ProductVersion FileVersion FileName
-------------- ----------- --------
6.2.9200.16384 6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\...
Můžete použít @Args
ve funkci, která má explicitně deklarované parametry. Můžete ho použít více než jednou ve funkci, ale všechny parametry, které zadáte, se předají do všech instancí @Args
, jak je znázorněno v následujícím příkladu.
function Get-MyCommand
{
Param ([switch]$P, [switch]$C)
if ($P) { Get-Process @Args }
if ($C) { Get-Command @Args }
}
Get-MyCommand -P -C -Name PowerShell
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
50 112.76 78.52 16.64 6880 1 powershell
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Extension : .exe
Definition : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Source : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Version : 10.0.22621.3085
Visibility : Public
OutputType : {System.String}
Name : powershell.exe
CommandType : Application
ModuleName :
Module :
RemotingCapability : PowerShell
Parameters :
ParameterSets :
HelpUri :
FileVersionInfo : File: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
InternalName: POWERSHELL
OriginalFilename: PowerShell.EXE.MUI
FileVersion: 10.0.22621.1 (WinBuild.160101.0800)
FileDescription: Windows PowerShell
Product: Microsoft® Windows® Operating System
ProductVersion: 10.0.22621.1
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
Notes
Pokud funkci převedete na pokročilou funkci pomocí atributů CmdletBinding nebo Parameter , $args
automatická proměnná už nebude ve funkci dostupná. Pokročilé funkce vyžadují explicitní definici parametru.
Konfigurace požadovaného stavu PowerShellu (DSC) nebyla navržena tak, aby používala splatting. K předání hodnot do prostředku DSC nelze použít splatting. Další informace naleznete v článku Gael Colas Pseudo-Splatting DSC Resources.