it-swarm.com.de

Führen Sie cmd-Befehle über Java aus

Ich habe mehrere Codeausschnitte zum Ausführen von cmd-Befehlen durch eine Java-Klasse gefunden, konnte sie jedoch nicht verstehen.

Dies ist der Code zum Öffnen der 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();
    }

}

Und ich habe einige andere Links zum Hinzufügen anderer Befehle gefunden, wie zum Beispiel cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-Java

Wie öffne ich den Befehl Aufforderung und füge Befehle mit Java ein?

Kann mir jemand helfen zu verstehen, wie man ein Verzeichnis wie das cd erstellt:

 cd C:\Program Files\Flowella

dann andere Befehle in diesem Verzeichnis ausführen?

42
Reham

Eine Möglichkeit, einen Prozess aus einem anderen Verzeichnis im Arbeitsverzeichnis Ihres Java-Programms auszuführen, besteht darin, das Verzeichnis zu ändern und dann den Prozess in derselben Befehlszeile auszuführen. Sie können dies tun, indem Sie cmd.exe aufrufen, um eine Befehlszeile wie cd some_directory && some_program auszuführen.

Das folgende Beispiel wechselt in ein anderes Verzeichnis und führt dort dir aus. Zugegeben, ich könnte einfach dieses Verzeichnis dir, ohne cd dazu zu benötigen, aber dies ist nur ein Beispiel:

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);
        }
    }
}

Beachten Sie auch, dass ich eine ProcessBuilder benutze, um den Befehl auszuführen. Dies ermöglicht es mir unter anderem, den Standardfehler des Prozesses in seine Standardausgabe umzuleiten, indem redirectErrorStream(true) aufgerufen wird. Dadurch kann ich nur einen Stream lesen.

Dies gibt mir folgende Ausgabe auf meinem Rechner:

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
115
Luke Woodward

Sie können dies versuchen: -

Process p = Runtime.getRuntime().exec(command);
8
Rahul Tripathi

Wenn Sie Aktionen wie cd ausführen möchten, verwenden Sie:

String[] command = {command_to_be_executed, arg1, arg2};
ProcessBuilder builder = new ProcessBuilder(command);
builder = builder.directory(new File("directory_location"));

Beispiel:

String[] command = {"ls", "-al"};
ProcessBuilder builder = new ProcessBuilder(command);
builder = builder.directory(new File("/ngs/app/abc"));
Process p = builder.start();

Es ist wichtig, dass Sie den Befehl und alle Argumente in separaten Zeichenfolgen des Zeichenfolgenarrays aufteilen (andernfalls werden sie von der ProcessBuilder-API nicht korrekt bereitgestellt).

5
Ashwini Sinha

Mein Beispiel (aus echtem Projekt)

ordner-Datei.

zipFile, filesString - String;

        final String command = "/bin/tar -xvf " + zipFile + " " + filesString;
        logger.info("Start unzipping: {}    into the folder {}", command, folder.getPath());
        final Runtime r = Runtime.getRuntime();
        final Process p = r.exec(command, null, folder);
        final int returnCode = p.waitFor();

        if (logger.isWarnEnabled()) {
            final BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = is.readLine()) != null) {
                logger.warn(line);
            }
            final BufferedReader is2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((line = is2.readLine()) != null) {
                logger.warn(line);
            }
        }
3
iMysak

Der einfachste Weg wäre die Verwendung von Runtime.getRuntime.exec() .

So erhalten Sie beispielsweise einen Registrierungswert für den Standardbrowser unter Windows:

String command = "REG QUERY HKEY_CLASSES_ROOT\\http\\Shell\\open\\command";
try
{
    Process process = Runtime.getRuntime().exec(command);
} catch (IOException e)
{
    e.printStackTrace();
}

Verwenden Sie dann eine Scanner, um ggf. die Ausgabe des Befehls abzurufen.

Scanner kb = new Scanner(process.getInputStream());

Note: Der \ ist ein Escape-Zeichen in einem String und muss mit einem Escape-Code versehen werden, damit er ordnungsgemäß funktioniert (daher der \\).


Es gibt jedoch keine ausführbare Datei namens cd, da diese nicht in einem separaten Prozess implementiert werden kann.

Der einzige Fall, in dem das aktuelle Arbeitsverzeichnis von Bedeutung ist, ist die Ausführung eines externen Prozesses (mit ProcessBuilder oder Runtime.exec() ). In diesen Fällen können Sie explizit das Arbeitsverzeichnis angeben, das für den neu gestarteten Prozess verwendet werden soll.

Einfachste Möglichkeit für Ihren Befehl: 

System.setProperty("user.dir", "C:\\Program Files\\Flowella");
2
syb0rg

Hier ist eine vollständigere Implementierung der Befehlszeilenausführung.

Verwendungszweck

executeCommand("ls");

Ausgabe:

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

Code

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);
}
2
Ilya Gazman

Sobald Sie die Referenz zu Process erhalten haben, können Sie getOutpuStream aufrufen, um die Standardeingabe der cmd-Eingabeaufforderung zu erhalten. Dann können Sie jeden Befehl über den Stream mit der write-Methode wie mit jedem anderen Stream senden.

Beachten Sie, dass es sich dabei um process.getOutputStream () handelt, das im Prozess mit dem stdin verbunden ist. In ähnlicher Weise müssen Sie getInputStream aufrufen, um die Ausgabe eines Befehls zu erhalten, und diesen Befehl dann wie jeden anderen Eingabestrom lesen.

1
Akhilesh Singh

Sie können cd nicht auf diese Weise ausführen, da cd kein echtes Programm ist. Es ist ein integrierter Teil der Befehlszeile und ändert lediglich die Umgebung der Befehlszeile. Es ist nicht sinnvoll, ihn in einem Unterprozess auszuführen, da Sie dann die Umgebung dieses Unterprozesses ändern. Der Unterprozess wird jedoch sofort geschlossen und die Umgebung wird verworfen.

Um das aktuelle Arbeitsverzeichnis in Ihrem aktuellen Java-Programm festzulegen, müssen Sie Folgendes schreiben:

System.setProperty("user.dir", "C:\\Program Files\\Flowella");
1
ruakh

Versuche dies: 

Process runtime = Runtime.getRuntime().exec("cmd /c start notepad++.exe");
1
Miguel Vieira

eine Möglichkeit, cmd von Java!

public void executeCmd() {
    String anyCommand="your command";
    try {
        Process process = Runtime.getRuntime().exec("cmd /c start cmd.exe /K " + anyCommand);

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

Der einfachste und kürzeste Weg ist die Verwendung von CmdTool library.

new Cmd()
         .configuring(new WorkDir("C:/Program Files/Flowella"))
         .command("cmd.exe", "/c", "start")
         .execute();

Weitere Beispiele finden Sie hier .

0