我需要构建一个实际上是命令行的字符串,然后执行该命令行的内容。我希望呼叫运营商(&)会有所帮助,但似乎没有。
$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”的调用周围放置分隔符,这样才能正常工作?
答案 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'