我找到了几个用于通过Java类运行cmd命令的代码片段,但我无法理解它.
这是打开cmd的代码
public void excCommand(String new_dir){
Runtime rt = Runtime.getRuntime();
try {
rt.exec(new String[]{"cmd.exe","/c","start"});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一些其他链接来添加其他命令,如cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java
任何人都可以帮助我了解如何cd目录,如:
cd C:\Program Files\Flowella
Run Code Online (Sandbox Code Playgroud)
然后在该目录上运行其他命令?
Luk*_*ard 121
将进程从不同目录运行到Java程序的工作目录的一种方法是更改目录,然后在同一命令行中运行该进程.您可以通过cmd.exe运行命令行 来完成此操作cd some_directory && some_program.
以下示例更改为其他目录并dir从那里运行.不可否认,我可以只需要dir该目录cd,但这只是一个例子:
import java.io.*;
public class CmdTest {
public static void main(String[] args) throws Exception {
ProcessBuilder builder = new ProcessBuilder(
"cmd.exe", "/c", "cd \"C:\\Program Files\\Microsoft SQL Server\" && dir");
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true) {
line = r.readLine();
if (line == null) { break; }
System.out.println(line);
}
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意,我正在使用a ProcessBuilder来运行命令.除此之外,这允许我通过调用将进程的标准错误重定向到其标准输出redirectErrorStream(true).这样做只给我一个流来读取.
这给了我在我的机器上的以下输出:
C:\Users\Luke\StackOverflow>java CmdTest
Volume in drive C is Windows7
Volume Serial Number is D8F0-C934
Directory of C:\Program Files\Microsoft SQL Server
29/07/2011 11:03 <DIR> .
29/07/2011 11:03 <DIR> ..
21/01/2011 20:37 <DIR> 100
21/01/2011 20:35 <DIR> 80
21/01/2011 20:35 <DIR> 90
21/01/2011 20:39 <DIR> MSSQL10_50.SQLEXPRESS
0 File(s) 0 bytes
6 Dir(s) 209,496,424,448 bytes free
Run Code Online (Sandbox Code Playgroud)
Rah*_*thi 10
你可以试试这个: -
Process p = Runtime.getRuntime().exec(command);
Run Code Online (Sandbox Code Playgroud)
小智 6
如果要执行类似的操作cd,请使用:
String[] command = {command_to_be_executed, arg1, arg2};
ProcessBuilder builder = new ProcessBuilder(command);
builder = builder.directory(new File("directory_location"));
Run Code Online (Sandbox Code Playgroud)
例:
String[] command = {"ls", "-al"};
ProcessBuilder builder = new ProcessBuilder(command);
builder = builder.directory(new File("/ngs/app/abc"));
Process p = builder.start();
Run Code Online (Sandbox Code Playgroud)
将命令和所有参数拆分为字符串数组的单独字符串非常重要(否则ProcessBuilderAPI 将无法正确提供它们).
下面是一个更完整的命令行执行实现。
executeCommand("ls");
Run Code Online (Sandbox Code Playgroud)
输出:
12/27/2017 11:18:11:732: ls
12/27/2017 11:18:11:820: build.gradle
12/27/2017 11:18:11:820: gradle
12/27/2017 11:18:11:820: gradlew
12/27/2017 11:18:11:820: gradlew.bat
12/27/2017 11:18:11:820: out
12/27/2017 11:18:11:820: settings.gradle
12/27/2017 11:18:11:820: src
Run Code Online (Sandbox Code Playgroud)
private void executeCommand(String command) {
try {
log(command);
Process process = Runtime.getRuntime().exec(command);
logOutput(process.getInputStream(), "");
logOutput(process.getErrorStream(), "Error: ");
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
private void logOutput(InputStream inputStream, String prefix) {
new Thread(() -> {
Scanner scanner = new Scanner(inputStream, "UTF-8");
while (scanner.hasNextLine()) {
synchronized (this) {
log(prefix + scanner.nextLine());
}
}
scanner.close();
}).start();
}
private static SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss:SSS");
private synchronized void log(String message) {
System.out.println(format.format(new Date()) + ": " + message);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
241037 次 |
| 最近记录: |