Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 PowerShell 3.0 můžete použít také 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 a [switch] parametrů.
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 skriptublock, který je spuštěn rutinou. Parametr ArgumentList přebírá pole hodnot, které jsou předány skriptublock. PowerShell efektivně používá maticové splatting k vytvoření vazby hodnot na parametry skriptublock. 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 skriptblock, 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 skriptublock jako jeden objekt.
Hello World!
Examples
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 v 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í @argsvš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)
Poznámky
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.
PowerShell Desired State Configuration (DSC) nebyl navržen tak, aby používal 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.