在含有空格的命令行中运行Java

3

我正在尝试从我的Java应用程序中运行一个.bat文件。我尝试了所有我能找到的方法,但似乎没有一个方法能够正常工作。

问题在于包含空格的.bat文件路径。

我现在正在使用这个方法,以便我可以在Eclipse控制台中查看结果。

我的实际代码是:

Runtime rt = Runtime.getRuntime();
String processString = "cmd /c \"" + homeFolder.getAbsolutePath() + SETUP_FILE + "\" \"" + homeFolder.getAbsolutePath() + "\"";
    try {
        Process proc = rt.exec(processString);
    ...
    }

我尝试过转义引号,不转义引号,将字符串分离为String[]并将每个以空格分隔的命令放在自己的单元格中:

{ "cmd", "/c", \"" + homeFolder.getAbsolutePath() + SETUP_FILE + "\" ... };

再试试带引号和不带引号的方式:都没有起作用。

我也尝试过将数组和字符串的路径硬编码。但每次结果都相同。

homeFolder = C:\Users\La bla bla\workspace\ToolMaker\bin\
SETUP_FILE = setup.bat

整个命令是这样的:
cmd /c "C:\Users\La bla bla\workspace\ToolMaker\bin\setup.bat" "C:\Users\La bla bla\workspace\ToolMaker\bin"

使用或不使用引号,输出结果相同:

Output: 
Error: 'C:\Users\La' is not recognized as an internal or external command,operable program or batch file.

显然我正在使用Windows操作系统(7,64位专业版),并且安装了Java 7。

我看到有些人之前也遇到过这个问题,但是我找不到解决方法。


你尝试过对空格字符进行编码吗? - dantuch
我已经尝试使用UTF-8对整个字符串进行编码。不确定这是否是您的意思。 - La bla bla
2个回答

9

使用接受 String[] 参数的 Runtime.exec(String[]) 版本:

Runtime rt = Runtime.getRuntime();
String[] processCommand = { "cmd", "/c", path };

try
{
    Process proc = rt.exec(processCommand);
    // ...
}

这对我来说可行(Win7):
Runtime rt = Runtime.getRuntime();
String[] processCommand = { "cmd", "/c", "c:" + File.separatorChar + "dir with spaces" + File.separatorChar + "test.bat" };

System.out.println("xPATH: " + processCommand[2]);

Process p = rt.exec(processCommand);
// output of the command is as expected

如果我明确使用\,这也适用:

String[] processCommand = { "cmd", "/c", "c:\\dir with spaces\\test.bat" };

实际上,我刚刚执行了这个测试,没有任何问题 Process proc = Runtime.getRuntime().exec(new String[]{"cmd", "/c", "dir", "C:/Program Files (x86)"}); - MadProgrammer
我复制并粘贴了你的代码,出于某种原因它可以工作...不过,如果我将"runas"、"/user:administrator"等内容添加到数组中,它就不能工作了。我需要以管理员身份运行这个批处理文件。 - La bla bla
没关系,我把顺序搞错了...虽然它仍然要求我输入密码...显然。 - La bla bla

0

我遇到了类似的问题,但我使用了start参数,所以可能不是“完全”相同的问题。

cmd不喜欢扩展目录名(我个人不知道为什么,我只知道它不喜欢)。它将需要“缩短”的(8.2)名称。

这意味着wallpaper.jpg需要变成WALLPA~1.JPG

在这里,你会遇到一个问题。如果你有许多wallpaper*.*文件,你想要哪一个?

现在,为了使其在Windows下正常工作,你需要深入到本地级别。

有一个名为GetShortPathName(和其变体)的Windows函数,基本上给定一个“长名称”(路径和文件名),它将为你生成“短名称”。


当我将整个命令复制粘贴到cmd中时,它可以正常工作。我会研究一下这个函数。 - La bla bla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接