0

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

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

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

一切正常,参数“Task A”、“Task B”、“Task C”被视为一个单元,可以传递给另一个可执行文件。

但是当使用调用表达式调用时

$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"'

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

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 回答
0

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

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