PowerShell
Splatting
Поиск…
Вступление
Splatting - это метод передачи нескольких параметров команде как единому блоку. Это делается путем сохранения параметров и их значений в виде пар ключ-значение в хэш-таблице и разбиения их на командлет с использованием оператора splatting @
.
Splatting может сделать команду более читаемой и позволяет повторно использовать параметры в командных вызовах mulitple.
замечания
Примечание. Оператор выражения Array или @()
имеют совсем другое поведение, чем оператор Splatting @
.
Подробнее о about_Splatting @ TechNet
Параметры разбивки
Splatting выполняется путем замены знака $
оператором splatting @
при использовании переменной, содержащей HashTable параметров и значений в командном вызове.
$MyParameters = @{
Name = "iexplore"
FileVersionInfo = $true
}
Get-Process @MyParameters
Без splatting:
Get-Process -Name "iexplore" -FileVersionInfo
Вы можете комбинировать нормальные параметры с разбитыми параметрами, чтобы легко добавлять общие параметры к вашим вызовам.
$MyParameters = @{
ComputerName = "StackOverflow-PC"
}
Get-Process -Name "iexplore" @MyParameters
Invoke-Command -ScriptBlock { "Something to excute remotely" } @MyParameters
Передача параметра Switch с использованием Splatting
Чтобы использовать Splatting для вызова Get-Process
с -FileVersionInfo
переключателя -FileVersionInfo
похожее на это:
Get-Process -FileVersionInfo
Это вызов с использованием splatting:
$MyParameters = @{
FileVersionInfo = $true
}
Get-Process @MyParameters
Примечание. Это полезно, потому что вы можете создать набор параметров по умолчанию и сделать вызов много раз, как это
$MyParameters = @{
FileVersionInfo = $true
}
Get-Process @MyParameters -Name WmiPrvSE
Get-Process @MyParameters -Name explorer
Трубопроводы и сращивание
Объявление splat полезно для повторного использования наборов параметров несколько раз или с небольшими вариациями:
$splat = @{
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
}
Get-WmiObject -ComputerName $env:COMPUTERNAME @splat
Get-WmiObject -ComputerName "Computer2" @splat
Get-WmiObject -ComputerName "Computer3" @splat
Однако, если знак не отстутнут для повторного использования, вы можете не захотеть его объявить. Вместо этого можно использовать каналы:
@{
ComputerName = $env:COMPUTERNAME
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
} | % { Get-WmiObject @_ }
Splatting от функции верхнего уровня до серии внутренней функции
Без splatting очень громоздко пытаться передавать значения вниз через стек вызовов. Но если вы комбинируете splatting с силой @PSBoundParameters, вы можете передать коллекцию параметров верхнего уровня вниз через слои.
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