PowerShell
splatting
Sök…
Introduktion
Splitting är en metod för att överföra flera parametrar till ett kommando som en enhet. Detta görs genom att lagra parametrarna och deras värden som nyckelvärdespar i en hashtable och dela upp dem till en cmdlet med hjälp av splitoperatören @
.
Splitting kan göra ett kommando mer läsbart och låter dig återanvända parametrar i flera kommandosamtal.
Anmärkningar
Obs: Array-uttrycksoperatören eller @()
har mycket annorlunda beteende än Splatting-operatören @
.
Läs mer på about_Splatting @ TechNet
Splattparametrar
Splitting görs genom att byta ut dollartecknet $
med splitteroperatören @
när du använder en variabel som innehåller en HashTable av parametrar och värden i ett kommandosamtal.
$MyParameters = @{
Name = "iexplore"
FileVersionInfo = $true
}
Get-Process @MyParameters
Utan att dela:
Get-Process -Name "iexplore" -FileVersionInfo
Du kan kombinera normala parametrar med splattade parametrar för att enkelt lägga till vanliga parametrar till dina samtal.
$MyParameters = @{
ComputerName = "StackOverflow-PC"
}
Get-Process -Name "iexplore" @MyParameters
Invoke-Command -ScriptBlock { "Something to excute remotely" } @MyParameters
Att skicka en switch-parameter med Splatting
Så här använder du Splatting för att ringa Get-Process
med -FileVersionInfo
omkopplaren liknande:
Get-Process -FileVersionInfo
Detta är samtalet med hjälp av splitting:
$MyParameters = @{
FileVersionInfo = $true
}
Get-Process @MyParameters
Obs: Det här är användbart eftersom du kan skapa en standarduppsättning paramatrar och ringa samtalet många gånger så här
$MyParameters = @{
FileVersionInfo = $true
}
Get-Process @MyParameters -Name WmiPrvSE
Get-Process @MyParameters -Name explorer
Rörning och stänk
Att förklara split är användbart för att återanvända uppsättningar av parametrar flera gånger eller med små variationer:
$splat = @{
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
}
Get-WmiObject -ComputerName $env:COMPUTERNAME @splat
Get-WmiObject -ComputerName "Computer2" @splat
Get-WmiObject -ComputerName "Computer3" @splat
Men om stänk inte är indraget för återanvändning, kanske du inte vill förklara det. Det kan ledas istället:
@{
ComputerName = $env:COMPUTERNAME
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
} | % { Get-WmiObject @_ }
Dela upp från toppnivåfunktion till en serie inre funktion
Utan att dela är det mycket besvärligt att försöka skicka värden ner genom samtalstacken. Men om du kombinerar splittring med kraften i @PSBoundParametrarna kan du passera den översta parametersamlingen genom lagren.
Function Outer-Method
{
Param
(
[string]
$First,
[string]
$Second
)
Write-Host ($First) -NoNewline
Inner-Method @PSBoundParameters
}
Function Inner-Method
{
Param
(
[string]
$Second
)
Write-Host (" {0}!" -f $Second)
}
$parameters = @{
First = "Hello"
Second = "World"
}
Outer-Method @parameters