ProcessBuilder无法在路径中运行带空格的bat文件

时间:2014-08-19 06:59:52

标签: java batch-file

我有以下代码段来运行bat文件:

String workingDir = System.getProperty("user.dir");

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", 
"\"" + workingDir + File.separator + "midl.bat\"");

Process ddsBuildProc = pb.start();

ddsBuildProc.waitFor();

workingDir包含路径中的空格。虽然我使用引号括起workingDir + fileName字符串,但shell仍会拆分workingDir并且不运行bat文件。如果手动尝试并复制粘贴 - 在Windows命令窗口中执行bat文件路径字符串,它将按预期工作。这可能是什么问题?

此外,请不要将此问题视为重复,因为我在其他问题中尝试了所有解决方案但没有成功。

1 个答案:

答案 0 :(得分:4)

  • 不要在命令列表中引用命令,除非执行的命令是预期的,否则这只会搞砸
  • user.dir是你的程序当前正在执行的上下文......所以包含它实际上是没有意义的,你可以单独使用midl.bat(假设命令存在于当前执行上下文中)< / LI>

我写了一个非常简单的批处理文件...

@echo off
dir

我放入“C:\ Program Files”目录,因为我需要一个带空格的路径并使用....

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

public class RunBatch {

    public static void main(String[] args) {
        ProcessBuilder pb = new ProcessBuilder(
                        "cmd", "/c", "listme.bat"
        );
        pb.directory(new File("C:/Program Files"));
        pb.redirectError();
        try {
            Process process = pb.start();
            InputStreamConsumer.consume(process.getInputStream());
            System.out.println("Exited with " + process.waitFor());
        } catch (IOException | InterruptedException ex) {
            ex.printStackTrace();
        }
    }

    public static class InputStreamConsumer implements Runnable {

        private InputStream is;

        public InputStreamConsumer(InputStream is) {
            this.is = is;
        }

        public static void consume(InputStream inputStream) {
            new Thread(new InputStreamConsumer(inputStream)).start();
        }

        @Override
        public void run() {
            int in = -1;
            try {
                while ((in = is.read()) != -1) {
                    System.out.print((char) in);
                }
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

    }

}

运行它没有任何问题......