【问题标题】:Problem with the output of a cmd command in javajava中cmd命令输出的问题
【发布时间】:2010-02-05 01:27:05
【问题描述】:

我正在尝试读取 cmd 命令的结果(例如 dir)。创建流程后,我将BufferedReaderInputStreamReader 结合使用。出于某种原因,BufferedReader 一直为空,即使我知道必须读取一些输出。

这是我正在使用的代码:

String[] str = new String[] {"cmd.exe", "/c", 
            "cd", "c:\\",
            "dir", "/b", "/s"               
    };
    Runtime rt = Runtime.getRuntime();
    try{

        Process p = rt.exec(str);
        InputStream is =p.getInputStream();
        System.out.println(is.available());
        InputStreamReader in = new InputStreamReader(is);

        StringBuffer sb = new StringBuffer();
        BufferedReader buff = new BufferedReader(in);
        String line = buff.readLine();
        System.out.println(line);
        while( line != null )
        {
            sb.append(line + "\n");
        System.out.println(line);
            line = buff.readLine();
        }
        System.out.println( sb );
        if ( sb.length() != 0 ){
            File f = new File("test.txt");
            FileOutputStream fos = new FileOutputStream(f);
            fos.write(sb.toString().getBytes());

            fos.close();
        }
    }catch( Exception ex )
    {
        ex.printStackTrace();
    }

【问题讨论】:

  • process.getErrorStream() 是否也返回空?
  • 是的 - ErrorStream 和 InputStream 都有 0 个字节可用
  • 我刚刚又跑了一遍,错误流不为空。当我阅读错误流时,它打印“系统找不到指定的路径”,这并不完全有意义,但至少它是一些东西。
  • 尝试强制文件的物理地址,C:\\test.txt 看看会发生什么
  • 这可能意味着 cmd.exe 不在 PATH 中(或 %PATH%,或者在 Windows 上调用的任何内容)。您可以尝试使用可执行文件的完整路径,至少一开始可以吗?

标签: java cmd


【解决方案1】:

你有:

String[] str = new String[] {"cmd.exe", "/c", 
            "cd", "c:\\",
            "dir", "/b", "/s"               
    };

这对我来说似乎不对。您不能在一个命令行上将多个命令放入 cmd.exe。那是一个批处理文件。

尝试摆脱 cd 或 dir 的所有内容。

编辑:确实:

C:\>cmd.exe /c cd c:\ dir
The system cannot find the path specified.

【讨论】:

  • 解决了问题!我在 cd 命令和 dir 命令之间加了一个“&”,得到了正确的输出!
  • @chama:简单地使用dir /b /s C:\​怎么样?只是为了好玩:尝试从另一个驱动器运行您的代码,例如D:。你的cd 命令在那里什么都不做。一般来说,使用任何适用的东西,不要试图使事情过于复杂。这是一个示例,您需要一个命令来执行您想要的操作。这两个序列不会。
【解决方案2】:

可能有错误。在这种情况下,您还应该捕获 getErrorStream()

【讨论】:

  • 我尝试捕获 ErrorStream 并得到“系统找不到指定的路径。”但是怎么找不到c:\?
【解决方案3】:

您正在运行的命令是cmd.exe /c cd c:\ dir /b /s。我认为这并没有达到你的预期。


我的意思是你已经将两个命令连接成一行,而 Windows shell 可能不喜欢这样。尝试类似

String[] str = new String[] {"cmd.exe", "/c", 
            "cd", "c:\\", "&&",
            "dir", "/b", "/s"               
    };

&& 将告诉 shell 执行cd c:\,然后如果第一个命令成功则执行dir /b /s

【讨论】:

  • 这是一个很好的观点。我最初是在该文件夹中搜索某个文件。不幸的是,取出 /s 并没有解决问题
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多