Führen Sie cmd-Befehle über Java aus

Lesezeit: 7 Minuten

Fuhren Sie cmd Befehle uber Java aus
Reham

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

Dies ist der Code zum Öffnen des 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 wie cd gefunden
http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java

Wie öffne ich die Eingabeaufforderung und füge Befehle mit Java ein?

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

 cd C:\Program Files\Flowella

dann andere Befehle in diesem Verzeichnis ausführen?

Eine Möglichkeit, einen Prozess aus einem anderen Verzeichnis als dem Arbeitsverzeichnis Ihres Java-Programms auszuführen, besteht darin, das Verzeichnis zu wechseln und den Prozess dann in derselben Befehlszeile auszuführen. Sie können dies tun, indem Sie erhalten cmd.exe zum Ausführen einer Befehlszeile wie z cd some_directory && some_program.

Das folgende Beispiel wechselt in ein anderes Verzeichnis und wird ausgeführt dir von dort. Zugegeben, ich könnte gerade dir dieses Verzeichnis ohne Notwendigkeit cd dazu, aber das 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 a verwende ProcessBuilder um den Befehl auszuführen. Dies erlaubt mir unter anderem, den Standardfehler des Prozesses in seine Standardausgabe umzuleiten, indem ich aufrufe redirectErrorStream(true). Dadurch habe ich nur einen Stream zum Lesen.

Dies gibt mir die folgende Ausgabe auf meiner Maschine:

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

  • Vielen Dank ..:) Ich habe einen weiteren Befehl nach der CD eingefügt. Ich möchte ihn im aktuellen Verzeichnis ausführen. Er verwendet einige Android-Befehle, aber er gibt mir, dass Android ‘nicht als interner oder externer Befehl erkannt wird, obwohl es funktioniert die cmd und ich fügte die Pfade zu den Umgebungsvariablen hinzu.

    – Reham

    18. März 2013 um 7:10 Uhr

  • Das klingt für mich nach einer PATH Ausgabe. Versuchen Sie, den Wert von auszudrucken PATH Umgebungsvariable, um zu sehen, ob sie den Pfad zu den von Ihnen erwähnten Android-Befehlen enthält. (Verwenden System.getenv("PATH") um seinen Wert zu erhalten.) Sie sagen nicht, wie Sie Ihren Java-Code ausführen (von einer Eingabeaufforderung, von einer IDE, in einer Webanwendung, …), also kann ich nicht sagen, was Sie tun könnten Beheben Sie dies offensichtlich PATH Ausgabe.

    – Lukas Woodward

    18. März 2013 um 22:14 Uhr

  • @LukeWoodward – Danke. Können Sie bitte erklären, was diese Zeichenfolgenparameter bedeuten – “/c” und “cd \”C:\\Program Files\\Microsoft SQL Server\” && dir” ? Ich versuche tatsächlich, einen SVN-Befehl auszuführen svn log --limit 1 http://svn.repo1.com/trunk/app von C:\Windows\system32. Bitte helfen Sie mir, dies richtig zu machen.

    – Dampf

    3. November 2014 um 6:46 Uhr

  • Ich habe mein Glück versucht und herausgefunden, wie es geht – ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", my_svn_code); Es funktioniert, aber ich weiß nicht, wie es funktioniert.

    – Dampf

    3. November 2014 um 6:58 Uhr


  • @Dampf: cmd.exe ist die Eingabeaufforderung. /c weist die Eingabeaufforderung an, den Rest der Zeile auszuführen und dann zu beenden. Mit einer Eingabeaufforderung kann ich das Verzeichnis wechseln – cd in die Eingabeaufforderung integriert ist, gibt es keine cd.exe – und auch um zwei Befehle mit zu verketten &&.

    – Lukas Woodward

    3. November 2014 um 21:18 Uhr

1646126826 264 Fuhren Sie cmd Befehle uber Java aus
Rahul Tripathi

Sie können dies versuchen: –

Process p = Runtime.getRuntime().exec(command);

  • Vielleicht, weil Sie verwenden Runtime.getRuntime().exec(...) anstelle einer ProcessBuilder? Ich persönlich betrachte Runtime.getRuntime().exec(...) als veraltet. (Ich war jedoch nicht so abwertend.)

    – Lukas Woodward

    17. März 2013 um 18:06 Uhr

  • Ich bin nicht der Downvoter, aber – Ihr Code ist fast genau derselbe wie der Code, den das OP bereits hat. Es wird nicht das Problem lösen, das das OP gerade hat.

    – ruach

    17. März 2013 um 18:08 Uhr

Fuhren Sie cmd Befehle uber Java aus
Ashwini Sinha

Wenn Sie Aktionen wie ausführen möchten cddann benutze:

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

Wichtig ist, dass Sie den Befehl und alle Argumente in separate Strings des String-Arrays aufteilen (sonst werden sie von der nicht korrekt bereitgestellt ProcessBuilder API).

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

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

1646126827 589 Fuhren Sie cmd Befehle uber Java aus
Lorbeer

Versuche dies:

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

Der einfachste Weg wäre die Verwendung 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 a Scanner um die Ausgabe des Befehls zu erhalten, falls erforderlich.

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

Notiz: der \ ist ein Fluchtzeichen in a Stringund muss maskiert werden, um richtig zu funktionieren (daher die \\).


Es wird jedoch keine ausführbare Datei aufgerufen cdweil es 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 (mithilfe von ProcessBuilder oder Runtime.exec()). In diesen Fällen können Sie das Arbeitsverzeichnis explizit angeben, das für den neu gestarteten Prozess verwendet werden soll.

Einfachster Weg für Ihren Befehl:

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

  • Wo soll ich diese Zeile hinzufügen, meinst du Runtime.getRuntime().exec(“cd what?”); kannst du mir ein beispiel für den cd befehl geben.

    – Reham

    17. März 2013 um 17:53 Uhr


  • Meine Antwort wurde bearbeitet, um hoffentlich etwas Klarheit zu schaffen.

    – syb0rg

    17. März 2013 um 17:55 Uhr

  • danke, aber ich erhalte java.io.IOException: Programm „cd“ kann nicht ausgeführt werden: CreateProcess error=2, Das System kann die unter java.lang.ProcessBuilder.start angegebene Datei nicht finden (unbekannte Quelle)

    – Reham

    17. März 2013 um 18:03 Uhr

  • @Reham Siehe meine überarbeitete Antwort, warum Sie Ihren spezifischen Befehl nicht so verwenden können, wie Sie es möchten.

    – syb0rg

    17. März 2013 um 18:15 Uhr

  • Betreff: “In einem Java-Programm können Sie Ihr aktuelles Arbeitsverzeichnis nicht ändern und sollten es auch nicht müssen”: Das ist nicht wahr. Siehe meine Antwort.

    – ruach

    17. März 2013 um 18:15 Uhr

899140cookie-checkFühren Sie cmd-Befehle über Java aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy