Как и зачем использовать сплаттинг (передача параметров [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]
Перевод: Виктор Горбунков