【问题标题】:Executing cmd file contained in a folder with space执行包含在有空间的文件夹中的 cmd 文件
【发布时间】:2013-08-16 12:08:29
【问题描述】:

我正在尝试使用带有以下代码的 JDK7u25 运行 cmd 文件:

try {
            ProcessBuilder pb = new ProcessBuilder(cmd);
            pb.directory(workingDir);
            proc = pb.start();
        } catch (IOException e) {
            System.out.println(e.getMessage());
            throw e;
        }
        // StdOut and Err Stream must be read immediatly even if they are not used

        // any error message?
        StreamInlet error = new StreamInlet(proc.getErrorStream(), "ERROR");

        // any output?
        StreamInlet output = new StreamInlet(proc.getInputStream(), "OUTPUT");

        // kick them off
        error.start();
        output.start();

        if (wait) {
            try {
                exitCode = proc.waitFor();
            } catch (InterruptedException e) {
                System.out.println("Waiting for process was interrupted");
            }
            if (addMetaInfo)
                System.out.println("Return value = " + exitCode);
        }

在哪里cmd=[cmd.exe, /c, C:\My Root\scripts\windows\tools\MyCLI.cmd, -c, C:\Local Disk D\My Tutorial\RegressionTests.xml, -d, 02_RecordViewer_Test, -l"ERROR"]

但它不起作用,我得到以下输出。

'C:\My' 未被识别为内部或外部命令,

可运行的程序或批处理文件。

我已经通过在调用 cmd 文件之前添加显式“CMD.EXE /C”对JDK7U21 issue 进行了必要的更改。我也在使用 JDK7u21 问题中提到的 ProcessBuilder 类。

如果我尝试执行的 cmd 文件放在 C:\MyRoot 中,即名称中没有空格的文件夹,它工作正常。

有人可以帮忙吗?

【问题讨论】:

  • 那是因为 cmd 需要 Windows 用引号 "C:\My Root\scripts\windows\tools\MyCLI.cmd""C:\Local Disk D\My Tutorial\RegressionTests.xml" 括起来的路径

标签: java cmd


【解决方案1】:

您需要将路径用引号引起来,cmd 要求:

String[] cmd = {"cmd.exe", "/c", "\"C:\\My Root\\scripts\\windows\\tools\\MyCLI.cmd\"", "-c", "\"C:\\Local Disk D\\My Tutorial\\RegressionTests.xml\"",.....};

更新正如我们通过聊天讨论的,问题似乎是ProcessBuilder 将参数传递给cmd.exe。但是由于您拥有可执行文件的完整路径,实际上根本不需要cmd.exe。所以命令看起来像这样:

String[] cmd = {"\"C:\\My Root\\scripts\\windows\\tools\\MyCLI.cmd\"", "-c", "\"C:\\Local Disk D\\My Tutorial\\RegressionTests.xml\"",.....};

【讨论】:

  • cmd 是一个字符串[]。我提出的 cmd 值是我从 eclipse 调试时得到的值。如上所述,我还尝试用双引号将其括起来。但没有运气:(
  • 但是您遇到了同样的错误?请发布您如何在cmd 控制台中调用相同的命令并检查它是否有效。
  • 如果我从 cmd 控制台显式调用它(通过用引号括起来)它可以工作。但是相同的命令行在 java 中不起作用。
  • 尝试在单个字符串中创建您的命令(在控制台中工作):String myCommand = "\"C:\\My Root\\scripts\\windows\\tools\\MyCLI.cmd\" -c \"C:\\Local Disk D\\My Tutorial\\RegressionTests.xml\" -d 02_RecordViewer_Test -l\"ERROR\"";,然后像这样调用ProcessBuilderProcessBuilder pb = new ProcessBuilder("cmd.exe","/c",myCommand)
  • 谢谢。但它也没有奏效。你也能在你的最后重现这个问题吗?
【解决方案2】:

我刚刚注意到这个问题已经在 J​​DK7u25 中得到解决。我刚刚在Release Notes 找到它。

【讨论】:

    【解决方案3】:

    我很想将反斜杠更改为正斜杠,并转义空格。

    C:/My\ Root/scripts/windows/tools/MyCLI.cmd
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多