首页 > 编程语言 >Java 解决 Process 执行命令行命令报【CreateProcess error=2, 系统找不到指定的文件。】错误问题

Java 解决 Process 执行命令行命令报【CreateProcess error=2, 系统找不到指定的文件。】错误问题

时间:2024-04-08 14:32:14浏览次数:22  
标签:exe Java String Process cmd CreateProcess pb process new

目录

问题

问题代码

解决方案

判断操作系统


问题

使用 Process 执行命令行命令时,报 CreateProcess error=2, 系统找不到指定的文件。但明明指定的文件是存在的。而且这种错误只在 IDEA 中运行会报错,打包后直接 java -jar 运行就能正常运行,不会报错。

问题代码

public class MyTest {

    public static void main(String[] args) throws Exception {
        Path dirPath = Paths.get("D:\\workspace\\funcproject");
        ProcessBuilder pb = new ProcessBuilder();
        pb.directory(dirPath.toFile());
        pb.command("fn", "version");

        Process process = pb.start();

        try (BufferedReader reader1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
             BufferedReader reader2 = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
            String line;
            while ((line = reader1.readLine()) != null) {
                System.out.println(line);
            }

            while ((line = reader2.readLine()) != null) {
                System.out.println(line);
            }

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

        process.waitFor();

    }

}

解决方案

以上面的问题代码为例,执行的命令行命令 fn 不是有效的可执行文件,而是由命令行 shell ( cmd.exe) 提供的命令。为了从其他进程运行此命令,必须启动cmd.exe并将参数传递给它。

在 Windows 开发环境下,需要在命令参数前面增加两个参数:"cmd.exe", "/C"

pb.command("cmd.exe", "/C", "fn", "version"); 

在 Linux 开发环境下,则新增两个参数为:"bash", "-c"

pb.command("bash", "-c", "fn", "version"); 

判断操作系统

打包后其实能正常运行,代码其实无需做调整。调试时可以在 IDEA 中将代码先改成可以正常运行的(先传入cmd.exe),然后在提交代码时再重新改回来。不过这样显然很麻烦,直接在通过代码来判断,先获取获取当前操作系统,然后根据不同的操作系统传入不同的 shell 名字。

public class MyTest {

    public void execute(String Command) throws Exception {
        ProcessBuilder pb = new ProcessBuilder();

        List<String> cmd = new ArrayList<>();
		String shell = getShellBySystem();
		cmd.add(shell);
		cmd.add(shell.equals("bash") ? "-c" : "/C");
        cmd.addAll(Arrays.asList(command.split(" ")));
        pb.command(cmd);

        Process process = pb.start();
        process.getInputStream();
        process.waitFor();
    }

    private String getShellBySystem() {
		String system = System.getProperty("os.name").toLowerCase();
		if (system.contains("win")) {
			return "cmd.exe";
		} else if (system.contains("linux")) {
			return "bash";
		} else {
			throw new RuntimeException(String.format("未知系统 %s", system));
		}
	}

}

标签:exe,Java,String,Process,cmd,CreateProcess,pb,process,new
From: https://blog.csdn.net/typeracer/article/details/137506073

相关文章

  • 中文地址实现去重计算-Java
    地名作为最常用的社会公共信息,不仅与人们的日常生活息息相关,而且是政府行政行为、经济建设不可缺少的基础信息资源。在电商场景中经常会遇到多源地址去重的场景,需要分析不同渠道的地址是否指向同一户,由于同一个地址可能会有不同书写方法,导致无法通过简单的去重和等值关联进行,为了......
  • JavaScript之applye、bind和call方法详解
    QuestionQ1apply()、bind()和call()方法的区别在哪?Q2apply()和call()的应用场景Q3apply()、bind()和call()方法手写实现逻辑来源继承自Function.prototype,属于实例方法console.log(Function.prototype.hasOwnProperty('call')) //trueconsole.log(Functio......
  • 基于Java+SpringBoot+Vue的SRM供应商系统(源码分享)
           前言:供应商招投标管理系统是一个综合性的管理平台,旨在规范供应商的招投标流程,确保采购过程的透明度和公正性,同时提高采购效率。以下是对您提到的各个环节的详细解释:一、供应商准入供应商准入是招投标管理系统的首要环节,它负责审核和管理潜在供应商的资质。具......
  • Java中的多态
    1.1多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。同一件事情,发生在不同对象身上,就会产生不同的结果。1.2多态实现条件在java中要实现多态,必须要满足如下几个条件,缺一不可:1.必须在继承体系下2.子类必......
  • 前端学习<四>JavaScript基础——11-流程控制语句:选择结构(if和switch)
    代码块用{}包围起来的代码,就是代码块。在ES5语法中,代码块,只具有分组的作用,没有其他的用途。代码块中的内容,在外部是完全可见的。举例: {   vara=2;   alert('qianguyihao');   console.log('千古壹号'); } ​ console.log('a='+a);打印结......
  • 前端学习<四>JavaScript基础——10-运算符
    我们在前面讲过变量,本文讲一下运算符和表达式。运算符的定义和分类运算符的定义运算符:也叫操作符,是一种符号。通过运算符可以对一个或多个值进行运算,并获取运算结果。表达式:数字、运算符、变量的组合(组成的式子)。表达式最终都会有一个运算结果,我们将这个结果称为表达式的......
  • JAVA语言学习-Day5
    集合Java中的集合是工具类,可以存储任意数量的具有共同属性的对象应用场景无法预测存储数据的数据同时存储具有一对一关系的数据需要进行数据的增删数据重复问题体系结构Collection:List、Queue、SetMap:HashMapList有序且可重复,ArrayList、LinkedList......
  • Java类全路径冲突解决方法
    1.问题今天在开发中遇到这样一个问题,A同事在导入了我们的实验SDK后,发现实验无法正常获取,查看日志发现了NoClassDefFoundError异常,无法加载的的类中逻辑比较简单,只依赖了另外一个SDK包2.NoClassDefFoundError分析和解决一般情况下,碰到NoClassDefFoundError错误,首先我们会想到......
  • Java零基础入门-String
    一、概述        近期有个小伙伴在看我的文章,说我在讲完基本类型,只是顺带提了一嘴String,然后说他的老师在课上对这String讲了足足一节课,好家伙,我觉得啊,这勾起了我的回忆,当初我看String的源码及知识点时,也是看了很久,这怪我,疏忽大意了啊。既然被这位小伙伴吐槽,那我就为......
  • Java零基础入门-多态
    一、概述        我之前上几期是教学了java类、及面向对象编程的三大基本特性,封装继承和多态。前一期,我是把继承大致讲了一遍,不知道你们对它有没有理解,何为继承,继承有啥好处,可以多继承嘛?等这类问题,我在上一期内容都有讲解,如果你们答不出来,没关系,你们可以再回去瞅瞅。......