[Java SE] Java执行命令行

1 序言

  • 执行命令行,是实现自动化程序跨环境调用的重要途径

2 源码示例

command = jps -l

package test.java;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @author johnny-zen
 * @version v1.0
 * @create-time 2023/8/25 11:38
 * @description ...
 * @refrence-doc
 *  [1] 如何在 Java 中运行命令行 - 火焰兔 - https://www.zadmei.com/rhzjzyxm.html
 * @gpt-promt
 */

public class ExecuteCommandTest {
    @Test
    public void processTest(){
        String command = "jps -l";// jps -l / java -verbose
        try {
            // 创建一个 Runtime 实例
            Runtime runtime = Runtime.getRuntime();
            // 执行命令行命令
            Process process = runtime.exec(command);

            // 获取命令行输出结果
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            // 等待命令行执行完毕
            int exitCode = process.waitFor();
            System.out.println("finished to execute the command, and the exit code : " + exitCode);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • output

processTest()

9984 org/netbeans/Main
22180 org.jetbrains.jps.cmdline.Launcher
22244 com.intellij.rt.junit.JUnitStarter
31268 sun.tools.jps.Jps
18424 D:\Program\DBeaver-23-0-4\dbeaver\plugins\org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
27368 org.jetbrains.jps.cmdline.Launcher
11788 cn.xxx.bd.datasource.biz.DataSourceApplication
6604 org.jetbrains.idea.maven.server.RemoteMavenServer36
finished to execute the command, and the exit code : 0

command = ping xxx

    @Test
    public void processBuilderTest(){
        try {
            // 指定要执行的命令或可执行文件及其参数
            List<String> command = Arrays.asList("ping","www.baidu.com");
            //List<String> command = Arrays.asList("cmd.exe", "/c", "dir");

            // 创建一个 ProcessBuilder 实例
            ProcessBuilder processBuilder = new ProcessBuilder(command); //new ProcessBuilder("dir", "-l");

            // 设置工作目录(可选)
            //String workingDirectory  = "C:\\Users\\xxxxxx\\Desktop";
            //processBuilder.directory(new File(workingDirectory));

            // 启动进程
            Process process = processBuilder.start();

            // 获取命令行输出结果 (可选)
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));// Windows CMD 默认以 GBK 字符集 编码文本
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 获取命令行输出 | 等待外部进程结束
            int exitValue = process.waitFor();
            System.out.println("finished to execute the command, and the exit code : " + exitValue);

            // 关闭进程
            process.destroy();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

processBuilderTest()

D:\Program\Java\jdk1.8.0_261\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Program\IDEA\IDEA_COMMUNITY 2022.2\lib\idea_rt.jar=61044:D:\Program\IDEA\IDEA_COMMUNITY 2022.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\xxxx\AppData\Local\Temp\classpath2097328303.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 test.java.ExecuteCommandTest,processBuilderTest

正在 Ping www.baidu.com [120.232.145.144] 具有 32 字节的数据:
来自 120.232.145.144 的回复: 字节=32 时间=44ms TTL=48
来自 120.232.145.144 的回复: 字节=32 时间=44ms TTL=48
来自 120.232.145.144 的回复: 字节=32 时间=45ms TTL=48
来自 120.232.145.144 的回复: 字节=32 时间=44ms TTL=48

120.232.145.144 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 44ms,最长 = 45ms,平均 = 44ms
<key: USERDOMAIN_ROAMINGPROFILE, value: XXXX>
...

获取环境变量信息

/**
 * 获取环境变量信息 (可选)
 */
public static void getEnvVariables(){
	// 指定要执行的命令或可执行文件及其参数
	List<String> command = Arrays.asList("cls");
	//List<String> command = Arrays.asList("cmd.exe", "/c", "dir");

	// 创建一个 ProcessBuilder 实例
	ProcessBuilder processBuilder = new ProcessBuilder(command); //new ProcessBuilder("dir", "-l");

	// 获取环境信息 (可选)
//             eg: <key: JAVA_HOME, value: D:\Program\Java\jdk1.8.0_261> ...
	Map<String, String> environment =  processBuilder.environment();
	environment.entrySet().forEach(varEntry -> {
		System.out.println(String.format("<key: %s, value: %s>", varEntry.getKey(), varEntry.getValue()));
	});
}

out

<key: USERDOMAIN_ROAMINGPROFILE, value: YYUYU>
<key: MAVEN_REPOSITORY_HOME, value: D:\Program_Data\maven_repository>
<key: PROCESSOR_LEVEL, value: 6>
<key: SESSIONNAME, value: Console>
<key: ALLUSERSPROFILE, value: C:\ProgramData>
<key: PROCESSOR_ARCHITECTURE, value: AMD64>
<key: PSModulePath, value: C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules>
<key: SystemDrive, value: C:>
<key: ARTHAS_HOME, value: D:\Program\Arthas\lib\3.5.2\arthas>
<key: MAVEN_HOME, value: D:\Program\maven\apache-maven-3.8.1>
<key: ACTIVEMQ_HOME, value: D:\Program\ActiveMQ\apache-artemis-2.19.1>
<key: USERNAME, value: xxxxxx>
<key: USERDNSDOMAIN, value: XXXX.COM>
<key: ProgramFiles(x86), value: C:\Program Files (x86)>
<key: TYPE, value: LATITUDE>
<key: PATHEXT, value: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC>
<key: DriverData, value: C:\Windows\System32\Drivers\DriverData>
<key: OneDriveConsumer, value: C:\Users\xxxxxx\OneDrive>
<key: INFLUXDB_HOME, value: D:\Program\influxdb\influxdb-1.8.4-1>
<key: PyCharm Community Edition, value: D:\Program\PyCharm\PyCharm2023.2.1\bin;>
<key: ProgramData, value: C:\ProgramData>
<key: ProgramW6432, value: C:\Program Files>
<key: GNU_HOME, value: D:\Program\GNUWin\GnuWin32>
<key: HOMEPATH, value: \Users\xxxxxx>
<key: PROCESSOR_IDENTIFIER, value: Intel64 Family 6 Model 140 Stepping 1, GenuineIntel>
<key: M2_HOME, value: D:\Program\maven\apache-maven-3.8.1\bin>
<key: ProgramFiles, value: C:\Program Files>
<key: PUBLIC, value: C:\Users\Public>
<key: windir, value: C:\Windows>
<key: =::, value: ::\>
<key: ZES_ENABLE_SYSMAN, value: 1>
<key: LOCALAPPDATA, value: C:\Users\xxxxxx\AppData\Local>
<key: IntelliJ IDEA, value: D:\Program\IDEA\IDEA 2021.3.1\IntelliJ IDEA 2021.3.1\bin;>
<key: NEO4J_HOME, value: D:\Program\Neo4j\neo4j-community-3.5.35>
<key: USERDOMAIN, value: XXXX>
<key: LOGONSERVER, value: \\CD-S-DC01>
<key: JAVA_HOME, value: D:\Program\Java\jdk1.8.0_261>
<key: =*:, value: *:\>
<key: GRADLE_HOME, value: D:\Program\gradle\gradle-6.8>
<key: NACOS_HOME, value: D:\Program\nacos\nacos-server-2.0.3\nacos>
<key: OneDrive, value: C:\Users\xxxxxx\OneDrive>
<key: APPDATA, value: C:\Users\xxxxxx\AppData\Roaming>
<key: GRADLE_USER_HOME, value: D:\Program_Data\maven_repository\>
<key: CHASSIS, value: Notebook>
<key: CommonProgramFiles, value: C:\Program Files\Common Files>
<key: Path, value: C:\Program Files\YunShu\utils;c:\Users\xxxxxx\AppData\Local\Programs\Cursor\resources\app\bin; ....>
<key: SERIAL, value: GNDJKG3>
<key: OS, value: Windows_NT>
<key: COMPUTERNAME, value: YYYYYY>
<key: CATALINA_HOME, value: D:\Program\Apache-Tomcat\apache-tomcat-8.5.84>
<key: MODEL, value: _3420>
<key: PROCESSOR_REVISION, value: 8c01>
<key: CLASSPATH, value: .;D:\Program\Java\jdk1.8.0_261\lib\dt.jar;D:\Program\Java\jdk1.8.0_261\lib\tools.jar;>
<key: CommonProgramW6432, value: C:\Program Files\Common Files>
<key: ComSpec, value: C:\Windows\system32\cmd.exe>
<key: SystemRoot, value: C:\Windows>
<key: TEMP, value: C:\Users\xxxxxx\AppData\Local\Temp>
<key: HOMEDRIVE, value: C:>
<key: USERPROFILE, value: C:\Users\xxxxxx>
<key: TMP, value: C:\Users\xxxxxx\AppData\Local\Temp>
<key: CommonProgramFiles(x86), value: C:\Program Files (x86)\Common Files>
<key: NUMBER_OF_PROCESSORS, value: 8>
<key: IDEA_INITIAL_DIRECTORY, value: D:\Program\IDEA\IDEA_COMMUNITY_2023.2\bin>

3 参考文献

posted @ 2023-08-25 15:32  千千寰宇  阅读(181)  评论(0)    收藏  举报