Wenn ich in Shell-Skripten 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 Batch-Dateien (oder Cmd-Dateien) gemacht werden
Wenn ich in Batch-Dateien dasselbe mache, verbleibe ich im neuen Verzeichnis.
Ich kann:
pushd temporary\new\directory && command && popd
Aber der Popd ist abhängig vom Erfolg von command
.
Irgendwelche Ideen?
Antworten:
Wenn Sie tun:
Sie verbleiben (wie Sie angeben) im Ordner \ windows. Versuchen:
und du solltest wieder da sein, wo du angefangen hast.
quelle
cd
/pushd
manchmal fehlschlägt (wenn das Verzeichnis zum Beispiel nicht existiert).pushd \windows && (foobar & popd)
kann zuverlässiger seinStandardmäßig werden Windows-Batchdateien im Kontext der übergeordneten Shell ausgeführt (was für Unix-Benutzer ungewöhnlich ist, bei denen eine explizite
source
Angabe erforderlich ist, in MS-DOS jedoch die einzige Möglichkeit war). Dies bedeutet, dass sich Verzeichnisänderungen und Umgebungsvariablen auch auf die ursprüngliche interaktive Shell auswirken.Platzieren Sie
setlocal
Ihr Skript ganz oben, damit es in einem eigenen Kontext ausgeführt wird. Sie können es dann sichercd
innerhalb des Skripts verwenden.quelle
(
)
nur Gruppenbefehle zusammen, aber immer noch im übergeordneten Kontext ausgeführt werden.(setlocal & cd foo & bar)
wird nicht funktionieren; stattdessenpushd foo && (bar & popd)
wäre nötig.Wie bereits erwähnt,
pushd \windows && (foobar & popd)
funktioniert Grawity besser, alspushd \windows & foobar & popd
wenn Letzteres fehlschlägt, wenn es kein solches Verzeichnis gibt.Auch die Verwendung
setlocal
undendlocal
ermöglicht es Ihnen , mehrere lokale Umgebungen haben, so zum Beispiel könnten Sie haben:setlocal
cd dir
command
endlocal
Nun würden Sie wieder in Ihrem ursprünglichen Verzeichnis sein.
quelle
Mit können Sie
cd -
zum vorherigen Arbeitsverzeichnis zurückkehren. Und;
stattdessen verwenden&&
, dann sind die nachfolgenden Befehle nicht vom Erfolg der vorherigen Befehle abhängig.quelle
Ich begrüße den Vorschlag von grawity,
setlocal
am Anfang Ihres Stapelskripts zu stehen, möchte aber hinzufügen, dass Sie mehrere, verschachteltesetlocal
/endlocal
-Blöcke haben können, sodass die Frage möglicherweise relevanter beantwortet wirdUnd natürlich, wenn Sie möchten, dass der Befehl nur ausgeführt wird, wenn
cd
todir2
erfolgreich ist, sagen wir .cd
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 den vorherigen Wert zurückgesetzt werdenendlocal
.quelle
Sie können das aktuelle Verzeichnis in einer Variablen speichern. Ändern Sie und ändern Sie zurück abhängig von dem Rückgabewert des Befehls. Übrigens gibt% CD% Ihr aktuelles DIR zurück.
quelle