【问题标题】:Windows java.exe -jar with spacesWindows java.exe -jar 带空格
【发布时间】:2020-09-30 15:16:42
【问题描述】:

我知道在 Java 中处理执行具有带空格路径的系统命令时已经有几十个问题,但我还没有找到针对我的确切情况的解决方案。

我在 Windows 10 计算机上使用 jdk-1.8.x 附带的 java.exe。我要执行的命令如下(我最终想在 Java 程序中使用ProcessBuilder,但我的问题并不取决于以这种方式执行的命令;如果我直接在终端中键入它,它仍然存在以及):

cmd.exe /C "G:\myself\...\My Folder\...\runtime\bin\java.exe" -jar "G:\myself\...\My Folder\...\application.jar" <app_args>

两个路径都包含My Folder,这是一个名称中带有空格的目录。但是,java.exe 的路径有效,但 application.jar 的路径无效。

我知道第一个路径有效,因为我可以运行:

cmd.exe /C "...\java.exe" -version

但是当我尝试运行第二个时,错误是:

'G:\myself\...\My' is not recognized as an internal or external command, operable program or batch file.

这是怎么回事? 为什么 java 的路径可以工作,而 jar 的路径却不行? java.exe -jar &lt;jar_path&gt;解析jar路径和终端解析java路径不同吗?

【问题讨论】:

  • 你为什么使用cmd.exe /C而不是直接调用java.exe
  • 就 cmd.exe 而言,我承认我真的不知道它为什么会起作用,但我是从 PowerShell 运行它,除非我在开​​头添加该部分,否则 java.exe 不会执行。
  • 要从 PowerShell 运行程序,您需要在它们前面加上 ./ - 这是为了防止无意中运行与内置命令同名的程序(与 Bash 相同)

标签: windows java-8 filepath java-process-runtime


【解决方案1】:

您没有直接运行java.exe - 您正在运行cmd.exe,然后指示cmd.exe 启动java.exe,这就是您处理命令行参数的问题。

当使用cmd.exe /C时,你需要传递一个长引号字符串,所以你需要通过加倍来转义双引号(令人困惑的是,在这种模式下,单双-引号字符不需要转义,只需要前导和后面的引号 - 它令人困惑且不一致(“它令人困惑且不一致”几乎概括了整个 Windows 命令行系统,但那是另一回事了)。

试试这个:

cmd.exe /C ""G:\myself\...\My Folder\...\runtime\bin\java.exe" -jar "G:\myself\...\My Folder\...\application.jar" "<app_args>""

对于 PowerShell

PowerShell 一旦你习惯了它就很棒(我还没有习惯它),但它与用于启动其他程序的普通 Windows 命令行令人讨厌地不同 - 只需键入PowerShell中的可执行文件的名称不会运行它,您需要使用长期Start-Process或使用点斜杠./(与Bash相同):

来自How to call a Java program from PowerShell?

Start-Process java.exe -ArgumentList '-jar', 'G:\myself\...\My Folder\...\application.jar'

【讨论】:

  • 您确定最后一个双引号对吗?这使得它们中有奇数个(7)
  • @owengall 很好,&lt;app_args&gt; 可能也需要引用 - 这取决于您的 Java 程序期望的实际参数。
  • 好的,非常感谢,我查了,你的解释是正确的。不过,我确实必须转义所有内部引号(如"`"&lt;path&gt;`"" 而不是""&lt;path&gt;"")。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多