Передача командной строки $ args в powershell от функции к функции - PullRequest
23 голосов
/ 20 августа 2009

Это неприятная проблема, с которой я сталкиваюсь. Не удивлюсь, если у него есть простое решение, просто оно ускользает от меня.

У меня есть 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, используемый в file1.ps, является System.Object [] вместо 3 строк.

Мне нужен способ передать $ args, полученный file1.ps1, в file2.ps1, почти так же, как это достигается% * в .bat файлах.

Боюсь, существующий способ сломается, даже если это вызов кросс-функции, точно так же, как вызов кросс-файла в моем примере.

Перепробовал несколько комбинаций, но ничего не работает.

Пожалуйста, помогите. Буду очень признателен.

Ответы [ 2 ]

34 голосов
/ 20 августа 2009

В PowerShell V2 , это тривиально с брызгами. бар просто становится:

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

при использовании.

9 голосов
/ 20 августа 2009
# use the pipe, Luke!

file1.ps1
---------
$args | write-host
$args | .\file2.ps1    

file2.ps1
---------
process { write-host $_ }
...