Vorübergehender Verzeichniswechsel für einen einzelnen Batchdateibefehl

Vorübergehender Verzeichniswechsel für einen einzelnen Batchdateibefehl

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 sourceerforderlich 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 setlocaloben in Ihr Skript ein, damit es in seinem eigenen Kontext ausgeführt wird. Sie können es cddann 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 setlocalund endlocalmehrere 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, setlocalan 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
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

Und natürlich, wenn Sie möchten, dass der Befehl nur ausgeführt wird, wenn cddiedir2erfolgreich ist, sagen wircddir2&&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.

verwandte Informationen