使用call运算符执行.exe

时间:2015-02-11 12:02:17

标签: powershell

我需要构建一个实际上是命令行的字符串,然后执行该命令行的内容。我希望呼叫运营商(&)会有所帮助,但似乎没有。

$cmd = "`'c:\some path with spaces in it\java.exe`'"
$arguments = "-jar","`"C:\some Other Path\MyJar.jar`""
& $cmd @arguments

(@joey在这里非常有用地建议:https://stackoverflow.com/a/28453250/201657

这产生了一个错误:

  

&安培; :术语'“C:\某些带有空格的路径\ java.exe”'未被识别为   cmdlet,函数,脚本文件或可操作程序。

然后我发现如果我将可执行文件放在不包含空格的路径中,那么我可以将我的代码更改为:

$command = "C:\somepathWithoutSpaces\java.exe"
$arguments = '-jar','"C:\someOtherPath\Cronacle.car"'
&$command @arguments

并且它有效(请注意缺少转义字符以放入分隔符)。

所以我想真正的问题是,我如何在“c:\某个带有空格的路径\ java.exe”的调用周围放置分隔符,这样才能正常工作?

1 个答案:

答案 0 :(得分:2)

除引用问题外,您所拥有的代码应该有效。请注意,该字符串应包含可执行文件的路径,而不需要任何其他引用。此外,参数不需要在字符串中引用。这就是我在上一个答案中明确指出的,PowerShell在正确使用时自动完成这些操作。

如果仍然抱怨找不到可执行文件,那么我会说它不在那里。

PS> $cmd = 'C:\Program Files\Java\jdk1.8.0_05\bin\java.exe'
PS> $arguments = ,'-version'
PS> & $cmd @arguments
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
尽管有空间,

对我来说还算不错。

同样,不要在程序或参数中添加其他引号:

PS> $cmd = '"C:\Program Files\Java\jdk1.8.0_05\bin\java.exe"'
PS> & $cmd @arguments
& : The term '"C:\Program Files\Java\jdk1.8.0_05\bin\java.exe"' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is
correct and try again.

注意字符串中的额外(和不必要的,甚至错误的)引用。同样适用于论点:

PS> $arguments = ,'''-version'''
PS> & $cmd @arguments
Error: Could not find or load main class '-version'