2011-04-02 25 views
0
public class CmdExec { 

    public static void main(String argv[]) { 
      try { 
       Runtime rt = Runtime.getRuntime(); 
       StreamWrapper error, output; 
       String TEMP = "/output:C:\\InstallList.txt product get name,version";  
       System.out.println(TEMP); 
       CmdExec rte = new CmdExec(); 
       Process proc = rt.exec("wmic"); 
       proc = rt.exec(TEMP); 

       error = rte.getStreamWrapper(proc.getErrorStream(), "ERROR"); 
       output = rte.getStreamWrapper(proc.getInputStream(), "OUTPUT"); 
       int exitVal = 0; 
       error.start(); 
       output.start(); 
       error.join(3000); 
       output.join(3000); 
       exitVal = proc.waitFor(); 
       System.out.println("Output: "+output.message+"\nError: "+error.message); 



    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
} 
} 

(原始方法) at java.lang.ProcessImpl。(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) at java.lang.ProcessBuilder.start(Unknown Source) at java.lang。 Runtime.exec(Unknown Source) at java.lang.Runtime.exec(Unknown Source) at java.lang.Runtime.exec(Unknown Source) at CmdExec.main(CmdExec.java:20)的java得到异常执行命令提示问题

+4

而你的问题是什么? – 2011-04-02 06:43:14

+0

为了更快得到更好的帮助,请发布[SSCCE](http://pscode.org/sscce.html),这应该可以解释什么是StreamWrapper。这也有助于提出一个具体的问题,正如Jon所指出的那样,即使它只是“我如何解决这个例外?”。 – 2011-04-02 07:24:28

+0

Runtime.exec为每个调用启动一个新的进程。 exec(“wmic”)将启动一个没有参数的进程,而exec(TEMP)的命令行参数没有可执行文件。结果是无稽之谈,失败了。 – josefx 2011-04-02 08:43:06

回答

1

问题是您试图执行"/output:C:\\InstallList.txt product get name,version"作为命令,并且不起作用。 (事实上​​,它看起来像废话给我。)

我希望你应该执行该命令是这样的:

rt.exec("wmic /output:C:\\InstallList.txt product get name,version"); 
+0

为什么不使用'String []'作为'rt.exec()'的参数?这样,'C:\\ Program Files \\ InstallList.txt'这样的输出路径就可以被处理而不需要任何转义字符或钝的替换字符。 – 2011-04-02 07:57:55

+0

@Andrew - 一般来说,这是真的。在这种特殊情况下,它没有任何区别。 (无论如何,“\”必须被转义...) – 2011-04-02 09:18:02

+0

这是一个很好的观点。 – 2011-04-02 12:59:14