2012-08-06 64 views
3

我试图从我的Java应用程序运行一个.bat文件。我尝试了所有可以找到的方法,但似乎没有任何工作。包含空格的Java运行命令行

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

我使用this方法,所以我现在可以看到我的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 + "\" ... }; 

再次,有和没有逸出报价s:没有用。

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

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

我看到一些人说他们之前有这个问题,但我找不到如何解决这个问题的答案。

+0

你试过编码空格字符吗? – dantuch 2012-08-06 00:22:39

+0

我试图用UTF-8编码整个字符串。不知道这是什么意思 – 2012-08-06 00:24:33

回答

8

使用Runtime.exec(String[])版本,需要一个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" }; 
+0

不。相同的结果.. – 2012-08-06 00:26:54

+0

真的,我只是做了这个测试没有问题'进程proc = Runtime.getRuntime().exec(新字符串[] {“cmd”,“/ c”,“dir”,“C:/ Program Files (x86)“});' – MadProgrammer 2012-08-06 00:37:33

+0

我复制并粘贴了你的代码,并且出于某种原因它的工作原理......但是,如果我将”runas“,”/ user:administrator“......添加到数组中,它不会更长的作品。我需要以管理员身份运行该批处理 – 2012-08-06 00:53:49

0

我有一个类似的问题,但我使用start参数,所以它可能不是“完全”同样的问题。

cmd不喜欢扩展的目录名称(我不知道为什么亲自,我只知道它没有)。它会希望“缩短”(8.2)名称,而不是

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

在这里,你遇到一个问题。如果您有多个wallpaper*.*文件,会发生什么情况,您要哪一个?

现在,为了让这个在windows下正常工作,你将不得不回到本地。

有一个叫做GetShortPathName(及其变种)的Windows函数,它基本上给出了一个“长名称”(路径和文件名)将为您生成“短名称”。

+0

当我复制并粘贴到cmd的整个命令,它的工作..我会看看这个功能。 – 2012-08-06 00:30:41