Powershell. Как передать аргументы скрипта в параметры функции из этого скрипта, без учёта порядка параметров?

В файле Powershell есть скрипт, внутри которого есть функция:

Function Test ($Content,$Out,[switch]$AsText) {
   $PSBoundParameters
}

Эта функция используется с разными параметрами в некоторых операция самого скрипта, но также её можно вызвать из скрипта напрямую с помощью аргумента скрипта "test":

if ($args[0] -match "^test$") {
   Test "D:\123.txt" -AsText
}

В этом первом случае функции передаётся значение параметра Content без названия этого параметра ("D:\123.txt"), просто потому, что этот параметр всегда передаётся первым. Затем передаётся параметр AsText без значения (потому что это тип Switch). В отличие от первого параметра, этот определяется не по порядку параметров функции (потому что по порядку он третий, а задано только два параметра), а по названию этого параметра AsText. Второй же параметр функции, Out - не передаётся и он остаётся пустым. Результат выполнения функции правильный:

Key     Value
---     -----
AsText  True
Content D:\123.txt

Но во втором случае я хочу аругментом test просто вызвать ту самую функцию без каких-либо других обработок сприптом и передать в неё оставшиеся аргументы скрипта, например, так:

if ($args[0] -match "^test$") {
   Test $args[1] $args[2] $args[3]
}

Ну или так, если всего аргументов больше 4, это не столь важно:

if ($args[0] -match "^test$") {
   $delimeter = '>1_3>'
   $arguments = $args -join $delimeter -replace ("^"+[Regex]::Escape($args[0]+$delimeter)),'' -split $delimeter
   Test @arguments
}

В последнем случае вызова функции используется splatting. В итоге в обоих случаях $args[0] не передаётся в функцию, потому что он вызывает саму эту функцию, в функцию передаются оставшиеся аргументы скрипта. Затем я вызываю скрипт с соответствующими аргументами:

.\test.ps1 test "D:\123.txt" -AsText

Однако результат получается другой:

Key     Value
---     -----
Content D:\123.txt
Out     -AsText

То есть параметр AsText не распознался по имени параметра, вместо этого он стал значением параметра Out, который идёт вторым в функции.

Вопрос: Как правильно заставить скрипт работать во втором случае также, как это происходит в первом случае? То есть как правильно вызывать функцию скрипта с передачей ей параметров из оставшихся аргументов самого скрипта, чтобы передаваемые параметры определялись не только по порядку, но и по названию параметров тоже, как это происходит при указании этих параетров непосредственно в скрипте (Test "D:\123.txt" -AsText)?

P.S. Примеры кода максимально упрощены для понимания, от чего могут выглядеть не логичными.


Ответы (0 шт):