当前位置: 首页 > 知识库问答 >
问题:

使用processbuilder从Java调用cmd命令

陈欣荣
2023-03-14

我试图调用cmd命令从Java使用进程构建器。然而,我面临的问题很少。

>

这个程序有时没有给出正确的输出。如果我使用process.destroy()方法并得到exitValue,它显示1。如果我注释掉process.destroy()方法,异常出现,进程没有退出。我猜可能是线程竞争条件。但是,没有process.waitFor()的影响。它有时仍然会产生错误的输出。我们如何测试这些情况并找出问题的真正原因?

我需要在cmd中调用一些命令。但是数组元素充当前一个的参数。例如,如果我用elemets作为cmd /Cdir whoami制作数组。那么这会产生错误的输出,因为whoami充当dir的参数。独立向cmd提供命令的正确方法是什么?

下面是具有相同问题的示例代码:

   import java.io.BufferedReader;
   import java.io.InputStreamReader;
   import java.util.Arrays;
   import java.util.List;
   public class Sample {
       public static void main(String[] args) throws Exception {
        //List<String> commandList = Arrays.asList("cmd.exe","dir");
        String[] commandList = {"cmd.exe", "/C", "dir"};
        //String[] commandList = {"cmd.exe", "/C", "dir", "whoami"};
        //String[] commandList = new String[] {"cmd.exe", "/C", "dir"};
        ProcessBuilder processBuilder = new ProcessBuilder(commandList);
        Process process = processBuilder.start();
        //process.waitFor();
        BufferedReader iReader = new BufferedReader(
                             new InputStreamReader(process.getInputStream()));
        String tempStr= "";
        StringBuffer buffer = new StringBuffer();
        while((tempStr = iReader.readLine())!=null){
            buffer.append(tempStr+System.lineSeparator());
        }
        System.out.println(buffer.toString());
        process.destroy();
        int exitValue = process.exitValue();
        System.out.println(exitValue);
    }
   }

共有1个答案

上官和惬
2023-03-14
  1. 阵列。asList(“cmd.exe”,“dir”)有两个列表元素。(“cmd.exe”,“dir”)与(“cmd.exe”,“/C”,“dir”)不同。它可能挂起,因为您忽略了包含描述错误的错误消息的错误输出。您可以使用processBuilder解决这个问题。重定向错误(ProcessBuilder.Redirect.INHERIT) (通常这是一个好主意,除非您计划以其他方式读取错误流)

顺便说一句,StringBuffer已经过时了。改用StringBuilder,因为它没有不必要的同步开销。

 类似资料:
  • 我正在尝试使用ProcessBuild运行cmd语句。 但是,我只能打开cmd。exe 那么如何编写此语句通过java运行cmd命令??我得到了错误,因为语句由"*"组成。如何编辑ProcessBuilder以便我可以运行语句?非常感谢

  • 本文向大家介绍Electron 调用命令行(cmd),包括了Electron 调用命令行(cmd)的使用技巧和注意事项,需要的朋友参考一下 因为最近的项目需求,需要在 Electron 客户端启动的时候启动 nginx 服务,所以研究了一下怎么在 Electron 调用 命令行。 因为 Electron 基于 Chromium 和 Node.js,可以直接使用 Node.js 的 API 和一些包

  • 线程“main”java.io.ioException中出现异常:无法运行程序“java” 但是当我从终端上运行任何java命令时,它们都工作得很好。 我发现的另一件事是,当我在终端中运行命令:并使用ProcessBuilder()时,它们会显示不同的输出。即ProcessBuilder命令中不显示jdk/bin的路径。 我如何解决这个问题?

  • 我试图使用Java的类来执行包含管道的命令。例如: 然而,我得到了一个错误: 然后: 尽管该命令在命令行中运行得很好,但我无法让执行将其输出重定向到另一个的命令。 有没有办法做到这一点?

  • 本文向大家介绍C#调用CMD命令实例,包括了C#调用CMD命令实例的使用技巧和注意事项,需要的朋友参考一下 有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。 代码如下,很简单,相信大家都能看懂,我就不赘述了。

  • 堆栈跟踪: cat://opt/mapr/zookeeper/zookeeeperversion:没有这样的文件或目录16/10/25 07:41:12信息Sqoop.Sqoop:运行Sqoop版本:1.4.6-mapr-1609 16/10/25 07:41:12警告工具。basesqooptool:在命令行设置密码不安全。考虑改用-p。16/10/25 07:41:13错误tool.bases