Temporäres Ändern des Verzeichnisses für einen einzelnen Stapelverarbeitungsbefehl


19

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?


Wie rufen Sie Ihre "Batch-Datei" oder "Cmd-Datei" auf? Wenn Sie einen cd-Befehl in ein Shell-Skript einfügen und dieses Skript ausführen (nicht als Quelle angeben), ändert sich das aktuelle Arbeitsverzeichnis der aufrufenden Shell nicht.
Garyjohn

Nur um klar zu sein, bezieht sich dies auf Windows Batch-Dateien.
Greg

Es ist ein Skript, das eine Reihe von Befehlen in verschiedenen Teilen eines Verzeichnisbaums ausführt. Einige der Befehle können nur im aktuellen Verzeichnis ausgeführt werden. Wenn Sie zum ursprünglichen Verzeichnis zurückkehren, können Sie die Daten, die das Skript steuern, vereinfachen. Schlagen Sie vor, für jedes Verzeichnis, in dem ich Anrufe tätigen möchte, eine separate Batch-Datei zu erstellen?
Greg

Wie ich mich erinnere, haben Sie auf Shell-Skripte verwiesen und Windows in Ihrer ursprünglichen Frage nicht erwähnt, sodass ich fälschlicherweise davon ausgegangen bin, dass Sie ein Unix-ähnliches System verwenden. Jetzt verstehe ich.
Garyjohn

Ja, sorry, mir ist klar, dass ich nicht klar war (obwohl ich denke, dass 'Batch-Datei' ein Hinweis war :-p)
Greg

Antworten:


21

Wenn Sie tun:

pushd \windows && foobar && popd

Sie verbleiben (wie Sie angeben) im Ordner \ windows. Versuchen:

pushd \windows & foobar & popd

und du solltest wieder da sein, wo du angefangen hast.


1
Ah, also ist ein einzelnes kaufmännisches Und das Äquivalent von Semikolon in sh. Das ist perfekt. (und eine Referenz: ss64.com/nt/syntax-conditional.html )
Greg

6
Es ist gut daran zu denken, dass cd/ pushdmanchmal fehlschlägt (wenn das Verzeichnis zum Beispiel nicht existiert). pushd \windows && (foobar & popd)kann zuverlässiger sein
Grawity

16

Standardmäßig werden Windows-Batchdateien im Kontext der übergeordneten Shell ausgeführt (was für Unix-Benutzer ungewöhnlich ist, bei denen eine explizite sourceAngabe 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 setlocalIhr Skript ganz oben, damit es in einem eigenen Kontext ausgeführt wird. Sie können es dann sicher cdinnerhalb des Skripts verwenden.


Danke, das hört sich nach dem an, was ich brauche - ich werde es überprüfen, wenn ich Zugriff auf einen Windows-Computer bekomme. Würde sich das auf Unterbefehle auswirken, die Klammern verwenden?
Greg

1
@ Greg: Es scheint, dass ( )nur Gruppenbefehle zusammen, aber immer noch im übergeordneten Kontext ausgeführt werden. (setlocal & cd foo & bar)wird nicht funktionieren; stattdessen pushd foo && (bar & popd)wäre nötig.
Grawity

4

Wie bereits erwähnt, pushd \windows && (foobar & popd)funktioniert Grawity besser, als pushd \windows & foobar & popdwenn Letzteres fehlschlägt, wenn es kein solches Verzeichnis gibt.

Auch die Verwendung setlocalund endlocalermö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.


3

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.

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

Ich habe die Frage aktualisiert, um zu verdeutlichen, dass ich Fragen zu Windows Batch / Shell-Skripten habe. Ich weiß, wie man es unter einer sh-ähnlichen Schale macht :)
Greg

Wie BillP3rd das Äquivalent von ';' in Batch-Dateien ist '&'.
Greg

Oh, tut mir leid. Ihre Verwendung von Schrägstrichen ließ mich denken, dass es UNIX war.
Bahamat

1

Ich begrüße den Vorschlag von grawity, setlocalam Anfang Ihres Stapelskripts zu stehen, möchte aber hinzufügen, dass Sie mehrere, verschachtelte setlocal/ endlocal-Blöcke haben können, sodass die Frage möglicherweise relevanter beantwortet wird

@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 cdto dir2erfolgreich ist, sagen wir .cddir2&&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 werden endlocal.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.