通过Java运行cmd命令

Reh*_*ham 50 java cmd cd

我找到了几个用于通过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

如何使用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)

  • @Steam:`cmd.exe`是命令提示符.`/ c`告诉命令提示符运行剩下的行,然后退出.使用命令提示符允许我更改目录 - `cd`内置于命令提示符,没有`cd.exe` - 并且还使用`&&`将两个命令链接在一起. (7认同)

Rah*_*thi 10

你可以试试这个: -

Process p = Runtime.getRuntime().exec(command);
Run Code Online (Sandbox Code Playgroud)

  • 我不是downvoter,但是 - 你的代码几乎与OP已经拥有的代码完全相同.它无法解决OP目前遇到的任何问题. (3认同)

小智 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 将无法正确提供它们).


Ily*_*man 5

下面是一个更完整的命令行执行实现。

用法

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)