Wenn ich beim Shell-Scripting einen Befehl aus einem Verzeichnis ausführen muss, kann ich eine Subshell verwenden, um sicherzustellen, dass ich zum ursprünglichen Kontext zurückkehre:
(cd temporary/new/directory ; command)
# now I am still in original directory
Kann dies in Windows-Batchdateien (oder cmd-Dateien) durchgeführt werden?
Wenn ich das Gleiche in Batchdateien mache, lande ich im neuen Verzeichnis.
Ich kann:
pushd temporary\new\directory && command && popd
Aber der POPD ist vom Erfolg von abhängig command
.
Irgendwelche Ideen?
Antwort1
Wenn Sie tun:
pushd \windows && foobar && popd
Sie bleiben (wie Sie sagen) im Ordner \windows. Versuchen Sie:
pushd \windows & foobar & popd
und Sie sollten sich wieder dort befinden, wo Sie begonnen haben.
Antwort2
Standardmäßig werden Windows-Batchdateien im Kontext der übergeordneten Shell ausgeführt (was für Unix-Benutzer ungewöhnlich ist, da hier ein expliziter Kontext source
erforderlich ist, unter MS-DOS jedoch die einzige Möglichkeit war). Dies bedeutet, dass Verzeichnisänderungen und Umgebungsvariablen auch die ursprüngliche interaktive Shell beeinflussen.
Fügen Sie es setlocal
oben in Ihr Skript ein, damit es in seinem eigenen Kontext ausgeführt wird. Sie können es cd
dann sicher innerhalb des Skripts verwenden.
Antwort3
Wie bereits von Grawity erwähnt, pushd \windows && (foobar & popd)
würde dies besser funktionieren als pushd \windows & foobar & popd
, da Letzteres fehlschlagen kann, wenn kein solches Verzeichnis vorhanden ist.
Darüber hinaus können Sie mit setlocal
und endlocal
mehrere lokale Umgebungen nutzen. So haben Sie beispielsweise folgende Möglichkeiten:
setlocal
cd dir
command
endlocal
Jetzt wären Sie wieder in Ihrem ursprünglichen Verzeichnis.
Antwort4
Ich begrüße den Vorschlag von Grawity, setlocal
an den Anfang Ihres Batch-Skripts zu setzen, möchte aber hinzufügen, dass Sie mehrere verschachtelte setlocal
/ endlocal
-Blöcke haben können, sodass eine relevantere Antwort auf die Frage sein könnte
@echo off
setlocal
cd
dir1
...
setlocal
cd
dir2
command
endlocal
:: Now I am back in
dir1
...
Und natürlich, wenn Sie möchten, dass der Befehl nur ausgeführt wird, wenn cd
diedir2
erfolgreich ist, sagen wircd
dir2
&&
command
.
Beachten Sie, dass der setlocal
/ endlocal
-Block eine lokalisierte Umgebung erstellt, sodass alle Variablen, die Sie in einem solchen Block festlegen oder ändern, nach dem auf ihren vorherigen Wert zurückgesetzt werden endlocal
.