Invoke-Expression不将逗号分隔的字符串列表作为单个参数传递给脚本

时间:2013-01-30 03:21:38

标签: powershell

我有一个PowerShell脚本,它调用批处理脚本(在内部运行perl),当从我的powershell脚本调用时,它不能正确解析参数。情况如下。

手动调用我的批处理/ perl脚本时

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

一切正常,参数“任务A”,“任务B”,“任务C”被视为一个传递到另一个可执行文件的单元。

但是在使用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”),但这需要我有额外的逻辑来解析这些,将它们放入一个数组中,然后将它们重新转换为字符串并传回另一个可执行文件。

3 个答案:

答案 0 :(得分:4)

Invoke-Expression采用PowerShell表达式。如果要运行可执行文件,只需使用&运营商。 e.g。

$exe = cmd.exe
$params = @("/C", "-tasks", '"Task A, "Task B", "Task C"') 
& $exe $params

答案 1 :(得分:0)

使用单引号和双引号字符串有几种不同的方法可以实现此目的。尝试:

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

帮助解决这些问题的一种方法是获取PowerShell Community Extensions并使用echoargs.exe util代替您要运行的程序,例如:

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接收参数。

答案 2 :(得分:0)

这里是脚本排除子文件夹并仅删除根文件夹的文件

foreach($a in $b=(Get-childItem "C:\test\" "*.*"| Where-Object{!$_.psiscontainer}).FullName)
{
   $c="cmd.exe /C del /f '$a'"
   Invoke-Expression  $c
}