3 Stimmen

Wechseln Sie das Verzeichnis und führen Sie die Batch-Datei in derselben Eingabeaufforderung aus

Gibt es eine Möglichkeit, die Eingabeaufforderung zu öffnen, das Verzeichnis in der Eingabeaufforderung zu wechseln und die Batch-Datei in derselben Eingabeaufforderung mit Java auszuführen?

Ich weiß, wie ich die Eingabeaufforderung mit Java öffnen kann. Danke!

8voto

Lawrence Dol Punkte 61053

Sie können die CD und die Stapeldatei in dem Wert für cmd.exe /K verschlüsseln. Aus der Doku (cmd /?):

Beachten Sie, dass mehrere Befehle, die durch das Komma getrennt sind, als Zeichenkette akzeptiert werden, wenn sie von Anführungszeichen umgeben sind.

Zum Beispiel:

cmd /C "CD C:\ && Dir"
cmd /C "CD C:\Windows && Dir"
cmd /C "CD C:\Windows && MySuperSuperBatchFile"

Weitere Einzelheiten finden Sie hier:

cmd /?

über die Befehlszeile.

7voto

itsadok Punkte 27963

Seien Sie vorsichtig mit Java's exec. Es kann hängen bleiben, wenn der Batch-Prozess den Ausgabepuffer füllt, und andere seltsame Probleme verursachen.

Ich schlage vor, Sie schauen sich Apache an Ausführung . Speziell für Ihre Bedürfnisse sollten Sie beachten, dass die Executor-Schnittstelle eine setWorkingDirectory Methode.

Grundlegende Verwendung:

Executor exec = new DefaultExecutor();
exec.setWorkingDirectory(new File("C:\\My\\Dir\\"));
CommandLine cl = new CommandLine("mybatch.bat");
int exitvalue = exec.execute(cl);

2voto

hlovdal Punkte 24350

Ein paar der java.lang.Runtime.exec() Variationen haben ein "dir"-Argument, also nehme ich an, dass Sie nicht daran denken?

Sie können das folgende C-Programm kompilieren und als Wrapper ausführen, um ein beliebiges Programm in einem beliebigen Verzeichnis zu starten. Wenn Sie ein String-Array mit Runtime.exec verwenden, vermeiden Sie alle Probleme mit dem Parsen von Befehlszeilen, der Portabilität und der korrekten Quotierung der Argumente.

Ich habe keinen Windows-Rechner zum Testen hier, aber wenn Sie das C-Programm zu cdexe.exe kompilieren, sollten Sie es wie folgt verwenden können:

public class Main {
        public static void main(String args[]) {
                String[] s = { "c:\\some\\place\\cdexe.exe",
                "c:\\start\\dir", "c:\\my\\batch\\file.bat", "arg1", "..." };
                try {
                        java.lang.Runtime.getRuntime().exec(s);
                } catch (java.io.IOException e) {
                        e.printStackTrace();
                }
        }
}

Ich vermute, dass unistd.h unter Windows nicht verfügbar ist, aber ersetzen Sie sie einfach durch eine Datei, die einen execv-Prototyp enthält.

#include <stdio.h>
#include <unistd.h>  // or hard code "int execv(const char *path, char *const argv[]);"

int main(int argc, char *argv[])
{
        if (argc < 3) {
                fprintf(stderr, "Error: Usage: %s <directory> <program> [arguments]\n", argv[0]);
                return 1;
        }
        if (chdir(argv[1]) < 0) {
                perror("Error");
                fprintf(stderr, "chdir(%s) failed\n", argv[1]);
                return 1;
        }
        argv[1] = argv[2];
        execv(argv[1], &argv[2]);      // use execvp if you want PATH to be searched
        perror("Error");
        fprintf(stderr, "execv returned\n");
        return 0;
}

0voto

Charlie Martin Punkte 106684

Es ist schwierig, aus Gründen der Plattformunabhängigkeit von Java aus zu tun: Was ist, wenn Sie Java auf einem System ausführen, das keine hierarchischen Verzeichnisse hat?

Es gibt eine Reihe von Umgehungsmöglichkeiten, je nachdem, was Sie wirklich tun wollen, aber die einfachste ist wohl, den eventuellen Befehl mit java.lang.Runtime.exec() .

.

0voto

Ron Punkte 1862

Holen Sie die Umgebungsvariable "comspec" und führen Sie aus %comspec% /c start/d Verzeichnis /b batchfile.bat

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X