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