Поиск…


Вступление

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow