O Splattingu
STRUČNÝ POPIS
Popisuje, jak pomocí splattingu předávat parametry příkazům v PowerShellu.
DLOUHÝ POPIS
[Tímto tématem přispěl Rohn Edwards z Gulfportu, Mississippi, správce systému a vítěz Advanced Division of the Scripting Games v roce 2012. Revidováno pro Windows PowerShell 3.0.]
Splatting je metoda předání kolekce hodnot parametrů do příkazu jako jednotky. PowerShell přidruží každou hodnotu v kolekci k parametru příkazu. Hodnoty splattovaných parametrů se ukládají do pojmenovaných proměnných splatting, 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 vaše příkazy zkrátí a zjednoduší jejich čtení. Hodnoty splattingu můžete znovu použít v různých voláních příkazů a pomocí splattingu předat hodnoty parametrů z $PSBoundParameters
automatické proměnné jiným skriptům a funkcím.
Od Windows PowerShell 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 nejsou požadovány názvy parametrů, použijte syntaxi pole. Pokud chcete zadat páry název parametru a hodnota, použijte syntaxi tabulky hash. Splatted hodnota se může zobrazit kdekoli v seznamu parametrů.
Při splattingu nemusíte k předání všech parametrů používat zatřiďovací tabulku ani pole. Některé parametry můžete předat pomocí splattingu a jiné podle pozice nebo názvu parametru. Můžete také nastavit více objektů v jednom příkazu, abyste nepředáli více než jednu hodnotu pro každý parametr.
SPLATTING S HASH TABULKAMI
Pomocí zatřiďovací tabulky můžete splatovat páry název parametru a hodnota. Tento formát můžete použít pro všechny typy parametrů, včetně pozičních a přepínacích parametrů. Poziční parametry musí být přiřazeny pomocí názvu.
Následující příklady porovnávají dva Copy-Item
příkazy, které zkopírují soubor Test.txt 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ů název_parametru a parametr-hodnota a uloží ji do $HashArguments
proměnné . Druhý příkaz používá proměnnou $HashArguments
v příkazu s splatting. Symbol At (@HashArguments
) nahrazuje v příkazu znak dolaru ($HashArguments
).
Pokud chcete zadat hodnotu parametru přepínače WhatIf, 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 zatřiďovacích tabulek v PowerShellu je: @{\<name\>=\<value\>; \<name\>=\<value\>; ...}*
SPLATTING S POLI
Pomocí pole můžete splatovat hodnoty pro poziční parametry, které nevyžadují názvy parametrů. Hodnoty musí být v matici seřazené podle pozice a čísla.
Následující příklady porovnávají dva Copy-Item
příkazy, které zkopírují soubor Test.txt 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í podle pozice.
Copy-Item "test.txt" "test2.txt" -WhatIf
Druhý příklad používá splatting pole. První příkaz vytvoří pole hodnot parametrů a uloží ho do $ArrayArguments
proměnné . Hodnoty jsou v poli v pořadí pozice. Druhý příkaz používá proměnnou $ArrayArguments
v příkazu při splattingu. Symbol At (@ArrayArguments
) nahrazuje v příkazu znak dolaru ($ArrayArguments
).
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
PŘÍKLADY
Tento příklad ukazuje, jak znovu použít splattované hodnoty v různých příkazech. Příkazy v tomto příkladu používají rutinu k zápisu Write-Host
zpráv do konzoly hostitelského programu. Pomocí splattingu určuje barvy popředí a pozadí.
Pokud chcete změnit barvy všech příkazů, stačí změnit hodnotu $Colors
proměnné .
První příkaz vytvoří tabulku hash obsahující názvy a hodnoty parametrů a uloží tabulku hash do $Colors
proměnné .
$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
Druhý a třetí příkaz používají proměnnou $Colors
pro splatting v Write-Host
příkazu. Pokud chcete použít $Colors variable
znak , nahraďte znak dolaru ($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."
Tento příklad ukazuje, jak předat 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 parametrů a hodnoty, 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ů předaných skriptu nebo funkci z Test2
funkce do Test1
funkce. Obě volání Test1
funkce z Test2
používají splatting.
function Test1
{
param($a, $b, $c)
$a
$b
$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
$LimitedParameters = $PSBoundParameters
$LimitedParameters.Remove("a") | Out-Null
Test1 @LimitedParameters
}
Test2 -a 1 -b 2 -c 3
1
2
3
2
3
PARAMETRY PŘÍKAZU SPLATTING
Splatting můžete použít k reprezentaci parametrů příkazu. Tato technika je užitečná při vytváření funkce proxy, tj. funkce, která volá jiný příkaz. Tato funkce je zavedená v Windows PowerShell 3.0.
Pokud chcete vyjádřit parametry příkazu, použijte @Args
k reprezentaci parametrů příkazu . Tato technika je jednodušší než výčet parametrů příkazu a funguje bez revize i v případě, že 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 do 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. Ve funkci ji můžete použít více než jednou, ale všechny parametry, které zadáte, se předají všem instancím objektu @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
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
408 28 75568 83176 620 1.33 1692 powershell
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
Extension : .exe
Definition : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
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.14393.0 (rs1_release.160715-1616
FileDescription: Windows PowerShell
Product: Microsoft Windows Operating System
ProductVersion: 10.0.14393.0
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
POZNÁMKY
PowerShell Desired State Configuration (DSC) nebyl navržen pro použití splattingu. K předání hodnot do prostředku DSC nemůžete použít splatting. Další informace najdete v článku Pseudo-Splatting DSC prostředků Gaela Colase.