Megosztás a következőn keresztül:


A Splatting-ról

Rövid leírás

Ez a cikk azt ismerteti, hogyan adhat át paramétereket a powershell-parancsoknak a splatting használatával.

Hosszú leírás

A splatting egy metódus, a paraméterértékek gyűjteményének egy parancsnak egységként való átadására. A PowerShell a gyűjtemény minden értékét egy parancsparaméterrel társítja. A splatted paraméterértékek nevesített szórásváltozókban vannak tárolva, amelyek standard változóknak tűnnek, de a dollárjel (@) helyett egy At szimbólummal ($) kezdődnek. A At szimbólum azt jelzi a PowerShellnek, hogy egyetlen érték helyett egy értékgyűjteményt ad át.

A splatting rövidebbé és könnyebben olvashatóvá teszi a parancsokat. A splatting értékeket újra felhasználhatja különböző parancshívásokban, és splatting használatával paraméterértékeket adhat át a $PSBoundParameters automatikus változóból más szkripteknek és függvényeknek.

A Windows PowerShell 3.0-tól kezdve a "splatting" technikával egy parancs összes paraméterét is reprezentálhatja.

Szemantika

<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>

Ha paraméterértékeket szeretne megadni a pozícióparaméterekhez, amelyekben nincs szükség paraméternevekre, használja a tömb szintaxisát. Paraméternév és értékpárok megadásához használja a kivonattábla szintaxisát. A splatted érték bárhol megjelenhet a paraméterlistában.

A splatting során nem szükséges hashtáblát vagy tömböt használnia az összes paraméter átadásához. Bizonyos paramétereket a splatting használatával adhat át, másokat pedig pozíció vagy paraméternév alapján adhat át. Emellett egyetlen parancsban több objektumot is splatálhat, hogy ne adjon át egynél több értéket az egyes paramétereknek.

A PowerShell 7.1-ben felülbírálhat egy splatted paramétert úgy, hogy explicit módon definiál egy paramétert egy parancsban.

Hash táblák szerinti paraméterátadás

Használjon kivonattáblát a paraméternév és az értékpárok összeillesztéséhez. Ezt a formátumot minden paramétertípushoz használhatja, beleértve a pozíció- és kapcsolóparamétereket is. A pozícióparamétereket név szerint kell hozzárendelni.

Az alábbi példák két Copy-Item parancsot hasonlítanak össze, amelyek a Test.txt fájlt az ugyanabban a könyvtárban lévő Test2.txt fájlba másolja.

Az első példa a paraméternevek hagyományos formátumát használja.

Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf

A második példa a kivonattáblázat paraméterátadási módszert használja. Az első parancs létrehoz egy paraméternév- és paraméter-érték párok kivonattábláját, és a $HashArguments változóban tárolja. A második parancs a $HashArguments változót használja egy "splatting" parancsban. Az At (@HashArguments) szimbólum a parancsban szereplő dollárjelet ($HashArguments) helyettesíti.

A WhatIf kapcsolóparaméter értékének megadásához használja $True vagy $False.

$HashArguments = @{
  Path = "test.txt"
  Destination = "test2.txt"
  WhatIf = $true
}
Copy-Item @HashArguments

Megjegyzés:

Az első parancsban az At szimbólum (@) egy kivonattáblát jelöl, nem pedig fonott értéket. A PowerShell kivonattábláinak szintaxisa a következő: @{<name>=<value>; <name>=<value>; ...}

Tömbök kiterítése

Egy tömb használatával olyan pozícióparaméterek értékeit splatálhatja, amelyek nem igényelnek paraméterneveket. Az értékeknek pozíció-szám sorrendben kell lenniük a tömbben.

Az alábbi példák két Copy-Item parancsot hasonlítanak össze, amelyek a Test.txt fájlt az ugyanabban a könyvtárban lévő Test2.txt fájlba másolja.

Az első példa azt a hagyományos formátumot használja, amelyben a paraméternevek ki vannak hagyva. A paraméterértékek pozíció sorrendben jelennek meg a parancsban.

Copy-Item "test.txt" "test2.txt" -WhatIf

A második példa tömb szétbontását használja. Az első parancs létrehoz egy tömböt a paraméterértékek közül, és a $ArrayArguments változóban tárolja. Az értékek pozíció sorrendben vannak a tömbben. A második parancs a $ArrayArguments változót használja egy splatting parancsban. Az At (@ArrayArguments) szimbólum a parancsban szereplő dollárjelet ($ArrayArguments) helyettesíti.

$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf

Az ArgumentList paraméter használata

Több parancsmag rendelkezik egy ArgumentList paraméterrel, amellyel paraméterértékeket ad át a parancsmag által végrehajtott szkriptblokknak. A ArgumentList paraméter a szkriptblokknak átadott értékek tömbje. A PowerShell hatékonyan használja a tömbösítést, hogy értékeket kössön a szkriptblokk paramétereihez. ArgumentListhasználatakor, ha egyetlen paraméterhez kötött objektumként kell átadnia egy tömböt, akkor a tömböt egy másik tömb egyetlen elemeként kell burkolnia.

Az alábbi példában egy szkriptblokk található, amely egyetlen paramétert vesz igénybe, amely sztringek tömbje.

$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
  } -ArgumentList $array

Ebben a példában csak a $array első eleme lesz átadva a szkriptblokknak.

Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
} -ArgumentList (,$array)

Ebben a példában $array egy tömbbe van csomagolva, hogy a teljes tömb egyetlen objektumként legyen átadva a szkriptblokknak.

Hello World!

Példák

1. példa: A kiszúrt paraméterek újrafelhasználása különböző parancsokban

Ez a példa bemutatja, hogyan használhatja újra a fonott értékeket különböző parancsokban. A példában szereplő parancsok a Write-Host parancsmaggal írnak üzeneteket a gazdagép programkonzoljára. Az előtér- és háttérszínek megadásához a splatting módszert használja.

Az összes parancs színének módosításához módosítsa a $Colors változó értékét.

Az első parancs létrehoz egy paraméternevekből és értékekből álló kivonattáblát, és a kivonattáblát a $Colors változóban tárolja.

$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}

A második és a harmadik parancs a $Colors változót használja paraméterezésként egy Write-Host parancsban. A $Colors variablehasználatához cserélje le a dollárjelet ($Colors) at szimbólumra (@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."

2. példa: Paraméterek továbbítása $PSBoundParameters

Ez a példa bemutatja, hogyan továbbíthatja a paramétereiket más parancsoknak a splatting és az $PSBoundParameters automatikus változó használatával.

Az $PSBoundParameters automatikus változó egy szótárobjektum (System.Collections.Generic.Dictionary), amely tartalmazza a szkriptek vagy függvények futtatásakor használt összes paraméternevet és értéket.

Az alábbi példában a $PSBoundParameters változóval továbbítjuk a szkriptnek vagy függvénynek átadott paraméterértékeket Test2 függvénytől a Test1 függvényhez. A Test1 mindkét hívása a Test2 függvényen splattinggal történik.

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

3. példa: Splatted paraméterek felülbírálása explicit módon definiált paraméterekkel

Ez a példa bemutatja, hogyan bírálhat felül egy splatted paramétert explicit módon definiált paraméterekkel. Ez hasznos lehet, ha nem szeretne új hash táblát létrehozni vagy módosítani egy értéket a splathoz használt hash táblában.

A $commonParams változó tárolja a paramétereket, hogy virtuális gépeket hozzon létre a East US helyen. A $allVms változó a létrehozandó virtuális gépek listája. Végigmegyünk a listán, és a $commonParams-t használjuk a paraméterek szétszórására, hogy létrehozzuk az egyes virtuális gépeket. Azt szeretnénk azonban, hogy myVM2 a többi virtuális gépétől eltérő régióban legyenek létrehozva. A $commonParams hash tábla módosítása helyett explicit módon definiálhatja a Location paramétert a New-AzVm-ban, a Location kulcs értékének felülírására $commonParams-ben.

$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
    }
}

Splatting parancsparaméterek

A splatting használatával egy parancs paramétereit jelölheti. Ez a technika akkor hasznos, ha proxyfüggvényt, vagyis egy másik parancsot meghívó függvényt hoz létre. Ez a funkció a Windows PowerShell 3.0-ban jelenik meg.

A parancs paramétereinek kibontásához használja a @Args a parancs paramétereit. Ez a technika egyszerűbb, mint a parancsparaméterek számbavétele, és akkor is korrektúra nélkül működik, ha az úgynevezett parancs paraméterei módosulnak.

A funkció az $Args automatikus változót használja, amely tartalmazza az összes hozzárendeletlen paraméterértéket.

Az alábbi függvény például meghívja a Get-Process parancsmagot. Ebben a függvényben @Args a Get-Process parancsmag összes paraméterét jelöli.

function Get-MyProcess { Get-Process @Args }

A Get-MyProcess függvény használatakor a rendszer minden hozzárendeletlen paramétert és paraméterértéket átad @Args, ahogyan az alábbi parancsok is mutatják.

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\...

A @Args olyan függvényekben is használhatja, amelyek kifejezetten deklarált paramétereket használnak. Egy függvényben többször is használhatja, de a megadott paramétereket a rendszer a @Argsösszes példányának átadja, ahogy az alábbi példában is látható.

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)

Jegyzetek

Ha a CmdletBinding vagy a Paraméter attribútumok használatával speciálissá tesz egy függvényt, a $args automatikus változó már nem lesz elérhető a függvényben. A speciális függvények explicit paraméterdefiníciót igényelnek.

A PowerShell Desired State Configuration (DSC) nem splatting használatára lett tervezve. Nem használhat splattingot az értékek DSC-erőforrásba való továbbításához. További információért lásd Gael Colas cikkét a Pseudo-Splatting DSC erőforrásokról.

Lásd még