about_Splatting
Краткое описание
Описывает, как использовать сплаттинг для передачи параметров в команды в PowerShell.
Подробное описание
Splatting — это метод передачи коллекции значений параметров команде в виде единицы. PowerShell связывает каждое значение в коллекции с параметром команды. Значения параметров splatted хранятся в именованных переменных splatting, которые выглядят как стандартные переменные, но начинаются с символа At () вместо@
знака доллара ($
). Символ At сообщает PowerShell, что вы передаете коллекцию значений, а не одно значение.
Сплаттинг делает команды более короткими и удобными для чтения. Значения сплаттинга можно повторно использовать в разных вызовах команд и использовать сплаттинг для передачи значений параметров из автоматической $PSBoundParameters
переменной в другие скрипты и функции.
Начиная с Windows PowerShell 3.0, можно также использовать сплаттинг для представления всех параметров команды.
Синтаксис
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
Чтобы предоставить значения параметров для позиционных параметров, в которых имена параметров не требуются, используйте синтаксис массива. Чтобы указать пары имени параметра и значения, используйте синтаксис хэш-таблицы. Значение splatted может отображаться в любом месте списка параметров.
При сплаттинге не нужно использовать хэш-таблицу или массив для передачи всех параметров. Некоторые параметры можно передать с помощью сплаттинга, а другие — по позиции или по имени параметра. Кроме того, вы можете выполнить несколько объектов в одной команде, чтобы не передавать более одного значения для каждого параметра.
В PowerShell 7.1 можно переопределить параметр splatted, явно определив параметр в команде.
Сплаттинг с хэш-таблицами
Используйте хэш-таблицу для создания пар имен параметров splat и значений. Этот формат можно использовать для всех типов параметров, включая позиционные параметры и параметры switch. Позиционные параметры должны назначаться по имени.
В следующих примерах сравниваются две Copy-Item
команды, которые копируют файл Test.txt в файл Test2.txt в том же каталоге.
В первом примере используется традиционный формат, в котором включаются имена параметров.
Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf
Во втором примере используется сплаттинг хэш-таблицы. Первая команда создает хэш-таблицу пар "имя параметра" и "параметр-значение" и сохраняет ее в переменной $HashArguments
. Вторая команда использует $HashArguments
переменную в команде со сплаттингом. Символ At (@HashArguments
) заменяет знак доллара ($HashArguments
) в команде.
Чтобы указать значение для параметра whatIf switch, используйте $True
или $False
.
$HashArguments = @{
Path = "test.txt"
Destination = "test2.txt"
WhatIf = $true
}
Copy-Item @HashArguments
Примечание
В первой команде символ At (@
) обозначает хэш-таблицу, а не сплаттовое значение. Синтаксис хэш-таблиц в PowerShell: @{<name>=<value>; <name>=<value>; ...}
Сплаттинг с массивами
Используйте массив для splat-значений для позиционных параметров, которые не требуют имен параметров. Значения должны быть в массиве в порядке номеров позиций.
В следующих примерах сравниваются две Copy-Item
команды, которые копируют файл Test.txt в файл Test2.txt в том же каталоге.
В первом примере используется традиционный формат, в котором имена параметров опущены. Значения параметров отображаются в команде в порядке позиции.
Copy-Item "test.txt" "test2.txt" -WhatIf
Во втором примере используется сплаттинг массива. Первая команда создает массив значений параметров и сохраняет его в переменной $ArrayArguments
. Значения в массиве находятся в порядке расположения. Вторая команда использует $ArrayArguments
переменную в команде в сплаттинге. Символ At (@ArrayArguments
) заменяет знак доллара ($ArrayArguments
) в команде.
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
Использование параметра ArgumentList
Несколько командлетов имеют параметр ArgumentList , который используется для передачи значений параметров блоку скрипта, который выполняется командлетом. Параметр ArgumentList принимает массив значений, передаваемых в блок скрипта. PowerShell эффективно использует сплаттинг массива для привязки значений к параметрам блока скрипта. Если при использовании ArgumentList необходимо передать массив в виде одного объекта, привязанного к одному параметру, необходимо заключив массив в качестве единственного элемента другого массива.
В следующем примере есть блок скрипта, который принимает один параметр, представляющий собой массив строк.
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
param([string[]]$words) $words -join ' '
} -ArgumentList $array
В этом примере в блок скрипта передается только первый элемент в $array
.
Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
param([string[]]$words) $words -join ' '
} -ArgumentList (,$array)
В этом примере упаковывается в массив, $array
чтобы весь массив передавался в блок скрипта в виде одного объекта.
Hello World!
Примеры
Пример 1. Повторное использование параметров splatted в разных командах
В этом примере показано, как повторно использовать сплатированные значения в разных командах. Команды в этом примере используют командлет для Write-Host
записи сообщений в консоль ведущего приложения. Он использует сплаттинг для указания цветов переднего плана и фона.
Чтобы изменить цвета всех команд, просто измените значение переменной $Colors
.
Первая команда создает хэш-таблицу имен и значений параметров и сохраняет хэш-таблицу в переменной $Colors
.
$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
Вторая и третья команды используют $Colors
переменную для сплаттинга в команде Write-Host
. Чтобы использовать , замените $Colors variable
знак доллара ($Colors
) символом 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."
Пример 2. Пересылка параметров с помощью $PSBoundParameters
В этом примере показано, как пересылать их параметры в другие команды с помощью splatting и автоматической переменной $PSBoundParameters
.
Автоматическая $PSBoundParameters
переменная — это объект словаря (System.Collections.Generic.Dictionary), содержащий все имена и значения параметров, используемые при выполнении скрипта или функции.
В следующем примере переменная используется $PSBoundParameters
для пересылки значений параметров, переданных в скрипт или функцию из Test2
функции в функцию Test1
. Оба вызова Test1
функции из Test2
используют splatting.
function Test1
{
param($a, $b, $c)
"a = $a"
"b = $b"
"c = $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
Test1 -b $PSBoundParameters.b -c $PSBoundParameters.c
}
Test2 -a 1 -b 2 -c 3
a = 1
b = 2
c = 3
a =
b = 2
c = 3
Пример 3. Переопределение сплатированных параметров явно определенными параметрами
В этом примере показано, как переопределить параметр splatted с помощью явно определенных параметров. Это полезно, если вы не хотите создавать новую хэш-систему или изменять значение в хэш-сводке, используемой для splat.
Переменная $commonParams
сохраняет параметры для создания виртуальных машин в расположении East US
. Переменная $allVms
представляет собой список создаваемых виртуальных машин. Мы циклически просматриваем список и используем $commonParams
для splat параметры для создания каждой виртуальной машины. Тем не менее, мы хотим myVM2
создать в регионе, отличном от других виртуальных машин. Вместо настройки $commonParams
хэш-сводки можно явно определить параметр Location в New-AzVm
, чтобы заменять значение Location
ключа в $commonParams
.
$commonParams = @{
ResourceGroupName = "myResourceGroup"
Location = "East US"
VirtualNetworkName = "myVnet"
SubnetName = "mySubnet"
SecurityGroupName = "myNetworkSecurityGroup"
PublicIpAddressName = "myPublicIpAddress"
}
$allVms = @('myVM1','myVM2','myVM3',)
foreach ($vm in $allVms)
{
if ($vm -eq 'myVM2')
{
New-AzVm @commonParams -Name $vm -Location "West US"
}
else
{
New-AzVm @commonParams -Name $vm
}
}
Пример 4. Использование нескольких объектов splatted в одной команде
В одной команде можно использовать несколько сплаттированных объектов. В этом примере различные параметры определяются в отдельных хэш-сводках. Хэш-сводки сброшены в одной Write-Host
команде.
$a = @{
Message = 'Hello', 'World!'
}
$b = @{
Separator = '|'
}
$c = @{
BackgroundColor = 'Cyan'
ForegroundColor = 'Black'
}
Write-Host @a @b @c
Параметры команды Splatting
Для представления параметров команды можно использовать сплаттинг. Этот метод полезен при создании прокси-функции, то есть функции, которая вызывает другую команду. Эта функция появилась в Windows PowerShell 3.0.
Чтобы определить параметры команды, используйте для @Args
представления параметров команды. Этот метод проще, чем перечисление параметров команды, и работает без изменения, даже если параметры вызываемой команды изменяются.
Функция использует автоматическую $Args
переменную, которая содержит все значения неназначенных параметров.
Например, следующая функция вызывает Get-Process
командлет . В этой функции @Args
представляет все параметры командлета Get-Process
.
function Get-MyProcess { Get-Process @Args }
При использовании Get-MyProcess
функции все неназначенные параметры и значения параметров передаются @Args
в , как показано в следующих командах.
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\...
Можно использовать @Args
в функции, которая имеет явно объявленные параметры. Его можно использовать несколько раз в функции, но все вводимые параметры передаются всем экземплярам @Args
, как показано в следующем примере.
function Get-MyCommand
{
Param ([switch]$P, [switch]$C)
if ($P) { Get-Process @Args }
if ($C) { Get-Command @Args }
}
Get-MyCommand -P -C -Name PowerShell
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
50 112.76 78.52 16.64 6880 1 powershell
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Extension : .exe
Definition : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Source : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Version : 10.0.22621.3085
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.22621.1 (WinBuild.160101.0800)
FileDescription: Windows PowerShell
Product: Microsoft® Windows® Operating System
ProductVersion: 10.0.22621.1
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
Примечания
При превратив функцию в расширенную функцию с помощью атрибутов CmdletBinding или Parameter , $args
автоматическая переменная больше не будет доступна в функции. Для расширенных функций требуется явное определение параметра.
PowerShell Desired State Configuration (DSC) не предназначен для использования сплаттинга. Нельзя использовать сплаттинг для передачи значений в ресурс DSC. Дополнительные сведения см. в статье Gael Colas о псевдосплаттинге ресурсов DSC.