Udostępnij za pośrednictwem


Как и зачем использовать сплаттинг (передача параметров [switch])

В нашем внутреннем списке рассылки кто-то недавно спросил, как передавать параметры команды switch из одной функции в другую.

Дословно вопрос звучал так: «Почему параметры [switch] не могут передаваться как параметры?».

Мой ответ был простым и кратким: «Они могут.»

Ответ на этот вопрос – отличный способ проиллюстрировать значение возможности PowerShell V2, под названием «Сплаттинг» (Splatting). Сплаттинг это две интересные возможности - возможность автоматически получить все параметры, передаваемые в функцию (они содержатся в переменной $psBoundParameters), и способность получить список или словарь аргументов и передать их дальше в следующую функцию.

Очень легко сделать ошибку в передаче параметров. [switch] позволяет определить параметр, просто воспользовавшись -ParameterName, а не -ParameterName True.

Когда вы попытаетесь передать значение другой вложенной функции, -SwitchParameterInOtherFunction $switchParameterInThisfunction установит значение переключателя во вложенной функции в true, после чего передаст позиционный параметр со значением параметра переключателя.

В V1 (первой версии powershell) эта проблема решалась установкой двоеточия (:) между именем параметра и его значением. В V2 эта проблема решается путем использования сплаттинга. Важные строки ниже выделены жирным шрифтом и курсивом.

V2:

V1:

function test2($x, $y, [switch]$passThru) {     "In Test 2"     "x:"     $x     "y:"     $y     "passThru:"     $passThru }

function test1($x, $y, [switch]$passThru) {     "In Test 1" Test2 @psBoundParameters}

test1 "a" "b" –passThru

function test2($x, $y, [switch]$passThru) {     "In Test 2"     "x:"     $x     "y:"     $y     "passThru:"     $passThru }

function test1($x, $y, [switch]$passThru) {     "In Test 1" Test2 -x:$x -y:$y -passThru:$passThru}

test1 "a" "b" –passThru

 

Итак, зачем же использовать сплаттинг? Вот мой ответ на вопрос в списке рассылки PowerShell:

Заметь, что используя @ psBoundParameters, мне не нужно указывать параметры по одному. Это и более удобно (меньше печатать) и создает меньше ошибок (меньше шанс забыть параметр или сделать опечатку).

Чтобы увидеть более серьезные примеры сплаттинга, стоит просмотреть команду Get-CommandPlugin и модуль CodeDownloader.

Надеюсь, это вам поможет,

Джеймс Брандейдж (James Brundage) [MSFT]

Перевод: Виктор Горбунков