Wenn Sie tun:
pushd \windows && foobar && popd
Sie werden (wie Sie angeben) im Ordner \ windows verbleiben. Versuchen:
pushd \windows & foobar & popd
und du solltest wieder da sein, wo du angefangen hast.
Wenn ich in Shell-Scripting einen Befehl aus einem Verzeichnis ausführen muss, kann ich eine Subshell verwenden, um sicherzustellen, dass ich zum ursprünglichen Kontext zurückkehrt:
(cd temporary/new/directory ; command) # now I am still in original directory
Kann dies in Windows-Batchdateien (oder cmd-Dateien) erfolgen
Wenn Sie dasselbe in Batch-Dateien tun, verbleiben Sie im neuen Verzeichnis.
Ich kann:
pushd temporary\new\directory && command && popd
Aber der Popd hängt vom Erfolg von ab command
.
Irgendwelche Ideen?
Wenn Sie tun:
pushd \windows && foobar && popd
Sie werden (wie Sie angeben) im Ordner \ windows verbleiben. Versuchen:
pushd \windows & foobar & popd
und du solltest wieder da sein, wo du angefangen hast.
Standardmäßig werden Windows-Stapeldateien im Kontext der übergeordneten Shell ausgeführt (was für Unix-Benutzer ungewöhnlich ist, bei denen ein expliziter source
Befehl erforderlich ist, in MS-DOS jedoch die einzige Möglichkeit war). Dies bedeutet, dass Verzeichnisänderungen und Umgebungsvariablen auch die ursprüngliche interaktive Shell beeinflussen.
Setzen setlocal
Sie das Skript an den Anfang, damit es in einem eigenen Kontext ausgeführt wird - Sie können es dann sicher cd
im Skript verwenden.
Mit können Sie cd -
zum vorherigen Arbeitsverzeichnis zurückkehren. Und ;
stattdessen verwenden &&
, dann hängen die nachfolgenden Befehle nicht vom Erfolg der vorherigen Befehle ab.
$ pwd /etc $ cd /var ; pwd ; cd - /var $ pwd /etc
Wie bereits erwähnt, pushd \windows && (foobar & popd)
funktioniert Grawity besser als pushd \windows & foobar & popd
weil letzteres möglicherweise fehlschlägt, wenn kein solches Verzeichnis vorhanden ist.
Auch die Verwendung setlocal
und endlocal
ermöglicht es Ihnen, mehrere lokale Umgebungen haben, so zum Beispiel könnten Sie haben:
setlocal
cd dir
command
endlocal
Sie befinden sich jetzt wieder in Ihrem ursprünglichen Verzeichnis.
Ich begrüße den Vorschlag von grawity, setlocal
an den Anfang Ihres Batch-Skripts zu setzen, aber ich würde die Tatsache hinzufügen, dass Sie mehrere, verschachtelte setlocal
/ endlocal
Blöcke haben können, so dass eine relevantere Antwort auf die Frage gegeben sein könnte
@echo off
setlocal
cd
dir1
...
setlocal
cd
dir2
command
endlocal
:: Now I am back in
dir1
...
Und natürlich, wenn Sie den Befehl soll nur dann ausgeführt werden, wenn die cd
zu dir2
erfolgreich ist, sagen .cd
dir2
&&
command
Beachten Sie, dass der Block setlocal
/ endlocal
eine lokalisierte Umgebung erstellt, sodass alle Variablen, die Sie in einem solchen Block festlegen oder ändern, nach dem Wert auf den vorherigen Wert zurückgesetzt werden endlocal
.
Sie können das aktuelle Verzeichnis in einer Variablen speichern. Ändern Sie und ändern Sie sie entsprechend dem Rückgabewert des Befehls. Übrigens,% CD% gibt Ihr aktuelles DIR zurück.