带有多个带空格的参数的Java ProcessBuilder

时间:2013-02-27 11:57:01

标签: java parameters cmd space processbuilder

我知道有很多关于从java执行进程的问题。但是我无法使用提供的答案来解决我的问题。 我正在尝试从java应用程序创建postgresql数据库备份。我使用以下代码

        //ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","D:/PostgreSQL 8.2/bin/pg_dump.exe","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","D:/backup test/backups/test_27-1-2013_210.backup", "test"});
        //ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","D:\\PostgreSQL 8.2\\bin\\pg_dump.exe","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","D:\\backup test\\backups\\test_27-1-2013_210.backup", "test"});
        ProcessBuilder probuilder = new ProcessBuilder(new String[]{"cmd","/c","\"D:\\PostgreSQL 8.2\\bin\\pg_dump.exe\"","-U","usr","-i","-h","localhost","-p","5432","-F","c","-b","-f","\"D:\\backup test\\backups\\test_27-1-2013_210.backup\"", "test"});
        Map<String, String> env = probuilder.environment();
        env.put("PGPASSWORD", "mypass");

        final Process process = probuilder.start();

执行上述代码后,我收到以下错误: D:\PostgreSQL' is not recognized as an internal or external command, operable program or batch file.

仅当备份文件的路径包含空格时才会出现问题,否则会创建备份。 我试图在文件路径中使用斜杠和反斜杠,我引用文件路径,但每次都得到相同的错误。可以从命令提示符执行命令。

我做错了什么。 ProcessBuilder中有关空格的参数数量是否有一些限制。 感谢

1 个答案:

答案 0 :(得分:5)

由于pg_dump.exe是一个exe(不是.bat),所以根本不需要cmd,它可能会导致比它解决的问题更多的问题。只需直接调用exe,然后删除文件路径周围的额外引号:

new String[]{"D:\\PostgreSQL 8.2\\bin\\pg_dump.exe","-U","usr","-i",
  "-h","localhost","-p","5432","-F","c","-b",
  "-f","D:\\backup test\\backups\\test_27-1-2013_210.backup", "test"}