Om Splatting
KORT BESKRIVNING
Beskriver hur du använder splatting för att skicka parametrar till kommandon i PowerShell.
LÅNG BESKRIVNING
[Detta ämne bidrogs av Rohn Edwards från Gulfport, Mississippi, en systemadministratör och vinnare av Advanced Division of the 2012 Scripting Games. Reviderad för Windows PowerShell 3.0.]
Splatting är en metod för att skicka en samling parametervärden till ett kommando som enhet. PowerShell associerar varje värde i samlingen med en kommandoparameter. Splattade parametervärden lagras i namngivna splattingvariabler, som ser ut som standardvariabler, men börjar med en At-symbol (@
) i stället för ett dollartecken ($
). Symbolen At anger för PowerShell att du skickar en samling värden i stället för ett enda värde.
Splatting gör dina kommandon kortare och enklare att läsa. Du kan återanvända splattningsvärdena i olika kommandoanrop och använda splatting för att skicka parametervärden från den $PSBoundParameters
automatiska variabeln till andra skript och funktioner.
Från och med Windows PowerShell 3.0 kan du också använda splatting för att representera alla parametrar i ett kommando.
SYNTAX
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
Om du vill ange parametervärden för positionsparametrar, där parameternamn inte krävs, använder du matrissyntaxen. Om du vill ange parameternamn och värdepar använder du hashtabellsyntaxen. Det splattade värdet kan visas var som helst i parameterlistan.
Vid splattning behöver du inte använda en hash-tabell eller en matris för att skicka alla parametrar. Du kan skicka vissa parametrar med hjälp av splatting och skicka andra efter position eller efter parameternamn. Du kan också formatera flera objekt i ett enda kommando bara så att du inte skickar fler än ett värde för varje parameter.
SPLATTING MED HASH-TABELLER
Använd en hash-tabell för att formatera parameternamn och värdepar. Du kan använda det här formatet för alla parametertyper, inklusive positions- och växelparametrar. Positionsparametrar måste tilldelas efter namn.
I följande exempel jämförs två Copy-Item
kommandon som kopierar Test.txt-filen till den Test2.txt filen i samma katalog.
I det första exemplet används det traditionella formatet där parameternamn ingår.
Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf
I det andra exemplet används hashtabellsplattning. Det första kommandot skapar en hash-tabell med parameternamn och parameter-value-par och lagrar den i variabeln $HashArguments
. Det andra kommandot använder variabeln $HashArguments
i ett kommando med splatting. Symbolen At (@HashArguments
) ersätter dollartecknet ($HashArguments
) i kommandot .
Om du vill ange ett värde för växelparametern WhatIf använder du $True
eller $False
.
$HashArguments = @{
Path = "test.txt"
Destination = "test2.txt"
WhatIf = $true
}
Copy-Item @HashArguments
Obs! I det första kommandot anger symbolen Vid (@) en hash-tabell, inte ett splattat värde. Syntaxen för hash-tabeller i PowerShell är: @{\<name\>=\<value\>; \<name\>=\<value\>; ...}*
SPLATTING MED MATRISER
Använd en matris för att splat-värden för positionsparametrar, som inte kräver parameternamn. Värdena måste vara i position-nummerordning i matrisen.
I följande exempel jämförs två Copy-Item
kommandon som kopierar Test.txt-filen till den Test2.txt filen i samma katalog.
I det första exemplet används det traditionella format där parameternamn utelämnas. Parametervärdena visas i positionsordning i kommandot .
Copy-Item "test.txt" "test2.txt" -WhatIf
I det andra exemplet används matrissplattning. Det första kommandot skapar en matris med parametervärdena och lagrar den i variabeln $ArrayArguments
. Värdena är i positionsordning i matrisen. Det andra kommandot använder variabeln $ArrayArguments
i ett kommando i splatting. Symbolen At (@ArrayArguments
) ersätter dollartecknet ($ArrayArguments
) i kommandot .
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
EXEMPEL
Det här exemplet visar hur du återanvänder splattade värden i olika kommandon. Kommandona i det här exemplet använder cmdleten Write-Host
för att skriva meddelanden till värdprogramkonsolen. Den använder splatting för att ange förgrunds- och bakgrundsfärger.
Om du vill ändra färgerna för alla kommandon ändrar du bara värdet för variabeln $Colors
.
Det första kommandot skapar en hash-tabell med parameternamn och värden och lagrar hash-tabellen i variabeln $Colors
.
$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
De andra och tredje kommandona använder variabeln $Colors
för att formatera i ett Write-Host
kommando. Om du vill använda ersätter du dollartecknet ($Colors
) med symbolen $Colors variable
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."
Det här exemplet visar hur du vidarebefordrar deras parametrar till andra kommandon med hjälp av splatting och den $PSBoundParameters
automatiska variabeln.
Den $PSBoundParameters
automatiska variabeln är ett ordlisteobjekt (System.Collections.Generic.Dictionary) som innehåller alla parameternamn och värden som används när ett skript eller en funktion körs.
I följande exempel använder vi variabeln $PSBoundParameters
för att vidarebefordra de parametervärden som skickas till ett skript eller en funktion från Test2
funktionen till Test1
funktionen. Båda anropen Test1
till funktionen från Test2
använd 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-KOMMANDOPARAMETRAR
Du kan använda splatting för att representera parametrarna för ett kommando. Den här tekniken är användbar när du skapar en proxyfunktion, d.v.s. en funktion som anropar ett annat kommando. Den här funktionen introduceras i Windows PowerShell 3.0.
Om du vill formatera parametrarna för ett kommando använder @Args
du för att representera kommandoparametrarna. Den här tekniken är enklare än att räkna upp kommandoparametrar och den fungerar utan revision även om parametrarna för den anropade kommandoändringen.
Funktionen använder den $Args
automatiska variabeln, som innehåller alla otilldelade parametervärden.
Följande funktion anropar till exempel cmdleten Get-Process
. I den här funktionen @Args
representerar alla parametrar för cmdleten Get-Process
.
function Get-MyProcess { Get-Process @Args }
När du använder Get-MyProcess
funktionen skickas alla otilldelade parametrar och parametervärden till @Args
, enligt följande kommandon.
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\...
Du kan använda @Args
i en funktion som uttryckligen har deklarerat parametrar. Du kan använda den mer än en gång i en funktion, men alla parametrar som du anger skickas till alla instanser av @Args
, enligt följande exempel.
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)
ANTECKNINGAR
PowerShell Desired State Configuration (DSC) har inte utformats för att använda splatting. Du kan inte använda splatting för att skicka värden till en DSC-resurs. Mer information finns i Gael Colas artikel Pseudo-Splatting DSC Resources.