Delen via


Over Splatting

KORTE BESCHRIJVING

Hierin wordt beschreven hoe u splatting gebruikt om parameters door te geven aan opdrachten in PowerShell.

LANGE BESCHRIJVING

[Dit onderwerp is bijgedragen door Rohn Edwards uit Gulfport, Mississippi, een systeembeheerder en de winnaar van de Advanced Division of the 2012 Scripting Games. Herzien voor Windows PowerShell 3.0.]

Splatting is een methode voor het als eenheid doorgeven van een verzameling parameterwaarden aan een opdracht. PowerShell koppelt elke waarde in de verzameling aan een opdrachtparameter. Splatted parameterwaarden worden opgeslagen in benoemde splattingvariabelen, die eruitzien als standaardvariabelen, maar beginnen met een At-symbool (@) in plaats van een dollarteken ($). Het symbool At vertelt PowerShell dat u een verzameling waarden doorgeeft in plaats van één waarde.

Splatting maakt uw opdrachten korter en gemakkelijker te lezen. U kunt de splattingwaarden opnieuw gebruiken in verschillende opdrachtaanroepen en splatting gebruiken om parameterwaarden van de $PSBoundParameters automatische variabele door te geven aan andere scripts en functies.

Vanaf Windows PowerShell 3.0 kunt u ook splatting gebruiken om alle parameters van een opdracht weer te geven.

SYNTAXIS

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

Als u parameterwaarden wilt opgeven voor positionele parameters, waarbij geen parameternamen zijn vereist, gebruikt u de matrixsyntaxis. Als u parameternaam en waardeparen wilt opgeven, gebruikt u de syntaxis van de hashtabel. De geplatte waarde kan overal in de lijst met parameters worden weergegeven.

Wanneer u splatting uitvoert, hoeft u geen hashtabel of matrix te gebruiken om alle parameters door te geven. U kunt bepaalde parameters doorgeven met behulp van splatting en andere doorgeven op positie of op parameternaam. U kunt ook meerdere objecten in één opdracht verdelen, zodat u niet meer dan één waarde voor elke parameter doorgeeft.

SPLATTING MET HASH-TABELLEN

Gebruik een hash-tabel om parameternaam en waardeparen te splaten. U kunt deze indeling gebruiken voor alle parametertypen, inclusief positionele en switch-parameters. Positionele parameters moeten worden toegewezen op naam.

In de volgende voorbeelden worden twee Copy-Item opdrachten vergeleken waarmee het Test.txt-bestand wordt gekopieerd naar het Test2.txt-bestand in dezelfde map.

In het eerste voorbeeld wordt de traditionele indeling gebruikt waarin parameternamen zijn opgenomen.

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

In het tweede voorbeeld wordt hashtabel-splatting gebruikt. Met de eerste opdracht maakt u een hash-tabel met parameter-naam- en parameter-waardeparen en slaat u deze op in de $HashArguments variabele. De tweede opdracht maakt gebruik van de $HashArguments variabele in een opdracht met splatting. Het symbool At (@HashArguments) vervangt het dollarteken ($HashArguments) in de opdracht.

Als u een waarde wilt opgeven voor de schakelparameter WhatIf, gebruikt $True u of $False.

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

Opmerking: In de eerste opdracht geeft het at-symbool (@) een hash-tabel aan, niet een geplatte waarde. De syntaxis voor hash-tabellen in PowerShell is: @{\<name\>=\<value\>; \<name\>=\<value\>; ...}*

SPLATTING MET MATRICES

Gebruik een matrix om waarden te splateren voor positionele parameters, waarvoor geen parameternamen zijn vereist. De waarden moeten in positie-getalvolgorde in de matrix staan.

In de volgende voorbeelden worden twee Copy-Item opdrachten vergeleken waarmee het Test.txt-bestand wordt gekopieerd naar het Test2.txt-bestand in dezelfde map.

In het eerste voorbeeld wordt de traditionele indeling gebruikt waarin parameternamen worden weggelaten. De parameterwaarden worden weergegeven in positievolgorde in de opdracht.

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

In het tweede voorbeeld wordt matrixsplatting gebruikt. Met de eerste opdracht maakt u een matrix van de parameterwaarden en slaat u deze op in de $ArrayArguments variabele. De waarden staan in positievolgorde in de matrix. De tweede opdracht maakt gebruik van de $ArrayArguments variabele in een opdracht in splatting. Het symbool At (@ArrayArguments) vervangt het dollarteken ($ArrayArguments) in de opdracht.

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

VOORBEELDEN

In dit voorbeeld ziet u hoe u geplatte waarden opnieuw gebruikt in verschillende opdrachten. De opdrachten in dit voorbeeld gebruiken de Write-Host cmdlet om berichten te schrijven naar de hostprogrammaconsole. Splatting wordt gebruikt om de voorgrond- en achtergrondkleuren op te geven.

Als u de kleuren van alle opdrachten wilt wijzigen, wijzigt u de waarde van de $Colors variabele.

Met de eerste opdracht maakt u een hash-tabel met parameternamen en -waarden en slaat u de hash-tabel op in de $Colors variabele.

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

De tweede en derde opdracht gebruiken de $Colors variabele voor splatting in een Write-Host opdracht. Als u de $Colors variablewilt gebruiken, vervangt u het dollarteken ($Colors) door het symbool 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."

In dit voorbeeld ziet u hoe u hun parameters doorstuurt naar andere opdrachten met behulp van splatting en de $PSBoundParameters automatische variabele.

De $PSBoundParameters automatische variabele is een woordenlijstobject (System.Collections.Generic.Dictionary) dat alle parameternamen en -waarden bevat die worden gebruikt wanneer een script of functie wordt uitgevoerd.

In het volgende voorbeeld gebruiken we de $PSBoundParameters variabele om de parameterwaarden door te sturen die zijn doorgegeven aan een script of functie van Test2 functie naar de Test1 functie. Beide aanroepen naar de Test1 functie gebruiken Test2 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

SPLATTING COMMAND PARAMETERS

U kunt splatting gebruiken om de parameters van een opdracht weer te geven. Deze techniek is handig wanneer u een proxyfunctie maakt, dat wil gezegd, een functie die een andere opdracht aanroept. Deze functie is geïntroduceerd in Windows PowerShell 3.0.

Als u de parameters van een opdracht wilt weergeven, gebruikt @Args u om de opdrachtparameters weer te geven. Deze techniek is eenvoudiger dan het inventariseren van opdrachtparameters en werkt zonder revisie, zelfs als de parameters van de aangeroepen opdracht worden gewijzigd.

De functie maakt gebruik van de $Args automatische variabele, die alle niet-toegewezen parameterwaarden bevat.

Met de volgende functie wordt bijvoorbeeld de Get-Process cmdlet aangeroepen. In deze functie @Args vertegenwoordigt alle parameters van de Get-Process cmdlet.

function Get-MyProcess { Get-Process @Args }

Wanneer u de Get-MyProcess functie gebruikt, worden alle niet-toegewezen parameters en parameterwaarden doorgegeven aan @Args, zoals wordt weergegeven in de volgende opdrachten.

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

U kunt gebruiken @Args in een functie die expliciet parameters heeft gedeclareerd. U kunt deze functie meerdere keren gebruiken in een functie, maar alle parameters die u invoert, worden doorgegeven aan alle exemplaren van @Args, zoals wordt weergegeven in het volgende voorbeeld.

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)

OPMERKINGEN

PowerShell Desired State Configuration (DSC) is niet ontworpen voor het gebruik van splatting. U kunt splatting niet gebruiken om waarden door te geven aan een DSC-resource. Zie het artikel Pseudo-Splatting DSC-resources van Gael Colas voor meer informatie.

ZIE OOK

about_Arrays

about_Automatic_Variables

about_Hash_Tables

about_Parameters