包含多个空格的参数上的Runtime.exec

任何人都可以进行以下运行吗?

public class ExecTest { public static void main(String[] args) { try { //Notice the multiple spaces in the argument String[] cmd = {"explorer.exe", "/select,\"C:\\New Folder\\file.txt\""}; //btw this works //String cmd = "explorer.exe /select,\"C:\\New Folder\\file.txt\""; //and surprisingly this doesn't work //String[] cmd = {"explorer.exe", "/select,\"C:\\New Folder\\file.txt\""}; //Update: and (as crazy as it seems) the following also worked //String[] cmd = {"explorer.exe", "/select,\"C:\\New", "Folder\\file.txt\""}; Runtime.getRuntime().exec(cmd); } catch (Exception e) { e.printStackTrace(); } } } 

使用Java 6.在Vista x64下测试。 顺便说一下,获取执行的字符串(你必须使用exec的String版本来获取它)并在Vista的开始菜单的搜索字段中使用它将按预期运行。
任何帮助将不胜感激。 我疯了……!

更新:我为我的post指出的第二个奇怪的东西添加了一个解决方案,这两个版本的exec表现不同。 解决方案基于prunge的答案。 Thnx再次。

好吧,这不仅仅是一个更新,而是一个答案,所以我把它归为一个。 根据我能找到的所有信息,理论上应该做到以下几点:

String [] cmd = {“explorer.exe”,“/ select,\”C:\ New“,”“,”“,”“,”“,”“,”“,”Folder \ file.txt \“ “};

多个空格已被分解为空字符串,并使用了exec的数组版本。 使用上面的数组,我在java.lang.ProcessImpl的第50-75行调试了循环,最后构造了一个字符串。 结果字符串是:

explorer.exe / select,“C:\ New Folder \ file.txt”

这是作为ProcessImpl的native create方法的第一个参数传递的(第118行同一个类),因为它似乎无法正常运行此命令

所以我想这一切都在这里结束……可悲的是。

Thnx prunge指出java bug。 Thnx每个人都有他们的时间和兴趣!

奇迹,它的作品!

不要问我为什么,但是当我在互联网上经过一段时间的神经破坏研究后,我已经接近放弃并使用临时批处理文件作为解决方法,我忘了将/ select,参数添加到命令,以及谁会想到,我的Win 7 32Bit系统上的以下工作。

 String param = "\"C:\\Users\\ME\\AppData\\Local\\Microsoft\\Windows\\Temporary Internet Files\\\""; try { String[]commands = new String[]{"explorer.exe", param}; Process child = Runtime.getRuntime().exec(commands); } catch (IOException e1) { System.out.println("..."); } 

一般解决方案

prunge在他的post中提到的bug数据库的解决方案( http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002 )对我来说很好。

原因:

显然问题在于它在实际执行命令字符串之前对java所做的一些字符的评论。 你必须通过对命令字符串进行标记来自己进行注释,以防止错误的java进行操作并使所有内容变得混乱。

怎么修:

因此,在我的情况下,我必须执行以下操作(将我的命令字符串标记,以便字符串中没有空格 ):

 String param[] = { "explorer.exe", "/select,C:\\Users\\ME\\AppData\\Local\\Microsoft\\Windows\\Temporary", "Internet", "Files\\"}; try { Process child = Runtime.getRuntime().exec(param); } catch (IOException e1) { System.out.println("..."); } 

正如你所看到的,我基本上在一个空格出现的地方开始了一个新的字符串,因此“Temporary Internet Files”变成了“Temporary”,“Internet”,“Files”。

除非命令行非常简单,否则始终使用Runtime.exec(String []),而不是Runtime.exec(String)。

首先使用new File(pathName).canExecute()来检查它是否可执行

编辑:

 public static void runAll(String... cmd) { for(String s : cmd) { try { Runtime.getRuntime().exec(cmd); } catch(Exception e) { e.printStackTrace(); } } } 

然后你就可以使用它: runAll("explorer.exe", "taskmgr.exe");

可能是一个Java bug。 请参阅: http : //bugs.sun.com/bugdatabase/view_bug.do?video_id = 6511002

出于好奇心进行了一些调试,我认为事情在java.lang.ProcessImpl中变得不稳定(参见构造函数)。 注意到当它实际调用底层Windows API时,字符串已变为

explorer.exe“/ select,”c:\ New Folder \ test.txt“”

这可以解释为什么,至于变通方法,请参阅bug数据库链接。

角色,-&和双倍空间,都是噩梦!

所有暴露在这里的答案都失败了"\\NAS\media\Music\Artistes\E\Earth, Wind & Fire\1992 - The eternal dance - Vol. 1 (1971-1975) (’Vol.1’和’之间的双重空间’ ‘(1971’)。

除了编写临时批处理文件,别无选择:

  void openFolderOf( Album album ) { try { final String path = album._playList.getParent(); final File batch = File.createTempFile( getClass().getSimpleName(), ".bat" ); try( PrintStream ps = new PrintStream( batch )) { ps.println( "explorer.exe \"" + path + '"' ); } Runtime.getRuntime().exec( batch.getAbsolutePath()); } catch( final Throwable t ) { t.printStackTrace(); } } 

注意:在cmd.exe上,行explorer "\\NAS..."运行良好,但Runtime.exec()和ProcessBuilder运行良好。

对于需要显示/选择命令的特定情况,我通过使用cmd / c start绕过windows引用噩梦:

 String[] cmd = {"cmd", "/c", "start explorer.exe /select," + path}; 

其中path是File对象的绝对路径。

解决这个文件问题的简单方法是java.awt.Desktop自1.6示例:

  Desktop.getDesktop().open(new File(fullFileName));