Передача командной строки $args в powershell, от функции к функции
Это неприятная проблема, с которой я столкнулся. Не удивлюсь, если у него будет простое решение, просто чтобы он ускользнул от меня.
У меня есть 2 пакетных файла, которые мне нужно преобразовать в сценарии powershell.
file1.bat
---------
echo %1
echo %2
echo %3
file2.bat %*
file2.bat
--------
echo %1
echo %2
echo %3
В командной строке я вызываю это как C: > file1.bat один два три
Результат, который я вижу, как и ожидалось один два три один два три
(Это грубый образец кода)
Когда я конвертирую в Powershell, у меня есть
file1.ps1
---------
Write-Host "args[0] " $args[0]
Write-Host "args[1] " $args[1]
Write-Host "args[2] " $args[2]
. ./file2.ps1 $args
file2.ps1
---------
Write-Host "args[0] " $args[0]
Write-Host "args[1] " $args[1]
Write-Host "args[2] " $args[2]
When I invoke this on powershell command line, I get
$> & file1.ps1 one two three
args[0] one
args[1] two
args[2] three
args[0] one two three
args[1]
args[2]
Я понимаю, это потому, что $args, используемые в файле1.ps, являются System.Object [] вместо 3 строк.
Мне нужен способ передать $args, полученные file1.ps1 в file2.ps1, почти так же, как это достигается% * в .bat файлах.
Я боюсь, что существующий способ сломается, даже если его вызов по перекрестным функциям, как раз в том, как его кросс файл вызывается в моем примере.
Попробовали несколько комбинаций, но ничего не работает.
Незлая помощь. Был бы очень благодарен.
Ответы
Ответ 1
В PowerShell V2 это тривиально с splatting. bar просто становится:
function bar { foo @args }
Splatting будет рассматривать элементы массива как отдельные аргументы, а не передавать его как один аргумент массива.
В PowerShell V1 это сложно, есть способ сделать это для позиционных аргументов. Для функции foo:
function foo { write-host args0 $args[0] args1 $args[1] args2 $args[2] }
Теперь вызовите его из панели с помощью метода Invoke()
в скриптблоке функции foo
function bar { $OFS=','; "bar args: $args"; $function:foo.Invoke($args) }
Что выглядит как
PS (STA) (16) > bar 1 2 3
bar args: 1,2,3
args0 1 args1 2 args2 3
когда вы его используете.
Ответ 2
# use the pipe, Luke!
file1.ps1
---------
$args | write-host
$args | .\file2.ps1
file2.ps1
---------
process { write-host $_ }