0

PowerShell スクリプトから呼び出されたときにパラメーターを正しく解析していないバッチ スクリプト (内部で perl を実行) を呼び出している PowerShell スクリプトがあります。状況は以下の通りです。

バッチ/perl スクリプトを手動で呼び出す場合

test.cmd -tasks "Task A","Task B","Task C"

すべてが正常に機能し、パラメーター「タスク A」、「タスク B」、「タスク C」は、別の実行可能ファイルに渡される 1 つのユニットとして扱われます。

ただし、invoke-expression を使用して呼び出す場合

$fullCommand = "cmd.exe /C C:\test\test.cmd -tasks  `"Task A`",`"Task B`",`"Task C`";
Invoke-Expression -Command $fullCommand;

バッチ スクリプトは、各文字列を個別のパラメーターと見なします。つまり、「タスク A」は -tasks の後の最初のパラメーターであり、次に「タスク B」、「タスク C」の順であり、スクリプトは処理方法を認識しません。

各タスク名を個別に渡すことでこれを回避できますが (例: -Task "Task A" -Task "Task B" -Task "Task C")、これらを解析するための追加のロジックが必要になります。配列を文字列に変換し、別の実行可能ファイルに戻します。

4

3 に答える 3

4

Invoke-Expression は、powershell 式を取ります。実行可能ファイルを実行したい場合は、 & 演算子を使用してください。例えば

$exe = cmd.exe
$params = @("/C", "-tasks", '"Task A, "Task B", "Task C"') 
& $exe $params
于 2013-01-30T13:14:28.233 に答える
0

一重引用符と二重引用符で囲まれた文字列を使用してこれを実現するには、いくつかの方法があります。試す:

iex 'cmd /c c:\test\test.cmd -tasks "Task A","Task B","Task C"'

これらの問題を解決する 1 つの方法は、PowerShell Community Extensionsを取得し、実行するプログラムの代わりにユーティリティを使用するechoargs.exeことです。

8> iex 'cmd /c EchoArgs.exe -tasks "Task A","Task B","Task C"'
Arg 0 is <-tasks>
Arg 1 is <Task A>
Arg 2 is <Task B>
Arg 3 is <Task C>

Command line:
EchoArgs.exe  -tasks "Task A" "Task B" "Task C"

プログラムが PowerShell から引数を受け取る方法が表示されます。

于 2013-01-30T03:55:08.800 に答える