【问题标题】:CMD.exe command in java not terminatingjava中的CMD.exe命令未终止
【发布时间】:2014-01-31 00:44:36
【问题描述】:

我正在尝试使用 cmd.exe 在特定目录中搜​​索文件,然后在 java 程序中显示路径并将其写入文件。问题是进程永远不会终止。

这是我的代码:

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

            Runtime rt = Runtime.getRuntime();
            try{

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


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

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

【问题讨论】:

    标签: java cmd terminate


    【解决方案1】:

    请尝试

    cmd /c
    

    而不是简单

    cmd
    

    Reference

    【讨论】:

    • 我应该把 cmd /c 而不是 cmd.exe 作为命令放在 str 中?如果是这样,我试过了,得到一个 IOException - 系统找不到指定的文件。
    • 您必须将/c 放在单独的参数中。 Runtime.exec("cmd.exe", "/c", ...)
    • cmd.exe 带有参数 /c 所以你的代码是:String[] str = new String[] { "cmd.exe", "/c", "\"cd c:\\&&dir /b /s documents\"" }; 这是否有效我不知道,但这就是 tangens 的意思:) 请注意,需要多个命令用&&分隔并用""括起来。
    • 谢谢 tangens - 我添加了 /c 作为 TommyA 所说的参数之一。程序终止,但由于某种原因,现在 StringBuffer 没有找到结果。
    【解决方案2】:

    Runtime.exec 不能这样工作。您不能将这样的多个命令传递给 cmd.exe。

    Runtime.exec 允许您使用参数列表执行单个进程。它不提供任何“shell”操作(例如2>&1)。您必须自己使用输入/输出流进行这种 IO 重定向。

    类似于调用另一个程序的main函数。

    你可以试试`Runtime.exec(new String[] { "cmd.exe", "/c", "dir", "C:\\" });

    但实际上,如果您想要文件列表,最好使用 java.io.File 类中的工具,它不依赖于操作系统的特定功能。

    【讨论】:

      【解决方案3】:

      为什么不使用Java to do directory traversal 而不是调用外部shell 命令?它使您的代码不可移植!

      【讨论】:

        【解决方案4】:

        除了带有 /C 或 /K 开关的 cmd.exe 进程之外,您还必须在启动命令之前使用启动命令。示例:要在 bash 控制台(来自 mingw 项目)中转换 Windows 的命令解释器,您必须使用命令 "C:\Windows\System32\cmd.exe /C start C:\mingw\ 调用 Runtime 类的 exec 方法msys\1.0\bin\bash.exe"(我使用外部命令而不是内部命令,因为它更重要,但您可以使用内部命令,如 DIR 等)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-29
          • 1970-01-01
          • 2019-05-04
          • 2013-11-27
          • 2016-02-12
          • 2018-05-29
          • 2013-06-11
          • 2012-05-05
          相关资源
          最近更新 更多