1、Linux和Windows使用示例代码
bash -c "cmd string": 用-c 是bash 会从第一个非选项参数后面的字符串中读取命令,如果字符串有多个空格,第一个空格前面的字符串是要执行的命令,也就是$0, 后面的是参数,即$1, $2...。
bash xxx.sh:bash 会在当前目录去寻找xxx.sh,如果找到直接运行,找不到则按照环境变量$PATH的指定路径,按顺序去找,如果找到则执行,找不到则报错。
1) Linux
ProcessBuilder processBuilder = new ProcessBuilder(); //执行windows命令 processBuilder.command("bash", "-c", "ls /home/cjavapy/"); // 执行shell脚本 processBuilder.command("path/to/hello.sh");
2) Windows
// 执行linux命令 processBuilder.command("cmd.exe", "/c", "dir C:\\Users\\cjavapy"); // 执行bat脚本 processBuilder.command("C:\\Users\\cjavapy\\getip.bat"); Process process = processBuilder.start();
2、执行ping命令
package com.cjavapy.process; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderExample1 { public static void main(String[] args) { ProcessBuilder processBuilder = new ProcessBuilder(); // 在Windows上运行这个命令,cmd, /c 参数是在运行后终止 processBuilder.command("cmd.exe", "/c", "ping -n 3 baidu.com"); // 在Linux上运行 //processBuilder.command("bash", "-c", "ping baidu.com"); try { Process process = processBuilder.start(); // blocked :( 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("\nExited with error code : " + exitCode); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
或者
package com.cjavapy.process; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.List; import java.util.concurrent.*; import java.util.stream.Collectors; public class ProcessBuilderExample2 { public static void main(String[] args) { ExecutorService pool = Executors.newSingleThreadExecutor(); ProcessBuilder processBuilder = new ProcessBuilder(); //在Windows上运行这个命令,cmd, /c 参数是在运行后终止 processBuilder.command("cmd.exe", "/c", "ping -n 3 google.com"); //在Linux上运行 //processBuilder.command("bash", "-c", "ping baidu.com"); try { Process process = processBuilder.start(); System.out.println("process ping..."); ProcessReadTask task = new ProcessReadTask(process.getInputStream()); Future<list<string>> future = pool.submit(task); // no block, can do other tasks here System.out.println("process task1..."); System.out.println("process task2..."); List<string> result = future.get(5, TimeUnit.SECONDS); for (String s : result) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(); } finally { pool.shutdown(); } } private static class ProcessReadTask implements Callable<list<string>> { private InputStream inputStream; public ProcessReadTask(InputStream inputStream) { this.inputStream = inputStream; } @Override public List<string> call() { return new BufferedReader(new InputStreamReader(inputStream)) .lines() .collect(Collectors.toList()); } } }
3、改变目录且显示目录中内容
package com.cjavapy.process; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderExample3 { public static void main(String[] args) { ProcessBuilder processBuilder = new ProcessBuilder(); //windows //processBuilder.command("cmd.exe", "/c", "dir"); //processBuilder.directory(new File("C:\\users")); //linux processBuilder.command("bash", "-c", "ls -al"); processBuilder.directory(new File("/home")); try { Process process = processBuilder.start(); 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("\nExited with error code : " + exitCode); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
相关文档:
Java 通过ProcessBuilder或Runtime.exec()调用(cmd/sh)系统命令方法代码
execute-shell-command-from-java