Verzeichnis vorübergehend für einen einzelnen Stapeldateibefehl ändern

22186
Greg

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?

17
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 verwenden), ändert sich das aktuelle Arbeitsverzeichnis der aufrufenden Shell nicht. garyjohn vor 12 Jahren 0
Um nur klar zu sein, bezieht sich dies auf Windows-Batch-Dateien. Greg vor 12 Jahren 0
Es ist ein Skript, das eine Reihe von Befehlen in verschiedenen Teilen eines Verzeichnisbaums ausführt. Einige Befehle funktionieren nur für das aktuelle Verzeichnis. Die Rückkehr zum ursprünglichen Verzeichnis vereinfacht die Daten, die das Skript steuern. Schlagen Sie vor, für jedes Verzeichnis, in dem ich telefonieren muss, eine separate Batchdatei zu erstellen? Greg vor 12 Jahren 0
Soweit ich mich erinnere, haben Sie sich auf Shell-Skripte bezogen und Windows in Ihrer ursprünglichen Frage nicht erwähnt. Daher habe ich fälschlicherweise angenommen, dass Sie ein Unix-ähnliches System verwenden. Jetzt verstehe ich. garyjohn vor 12 Jahren 0
Ja, Entschuldigung, mir ist klar, dass ich nicht klar war (obwohl ich denke, dass 'batch-file' ein Hinweis war :-p) Greg vor 12 Jahren 0

6 Antworten auf die Frage

20
BillP3rd

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.

Ah, so ist ein einzelnes Et-Zeichen das Äquivalent von Semikolon in sh. Das ist perfekt. (und eine Referenz: http://ss64.com/nt/syntax-conditional.html) Greg vor 12 Jahren 1
Denken Sie daran, dass `cd` /` pushd` manchmal fehlschlägt (wenn das Verzeichnis beispielsweise nicht vorhanden ist). `pushd \ windows && (foobar & popd)` kann zuverlässiger sein grawity vor 12 Jahren 5
13
grawity

Standardmäßig werden Windows-Stapeldateien im Kontext der übergeordneten Shell ausgeführt (was für Unix-Benutzer ungewöhnlich ist, bei denen ein expliziter sourceBefehl 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 setlocalSie das Skript an den Anfang, damit es in einem eigenen Kontext ausgeführt wird - Sie können es dann sicher cdim Skript verwenden.

Danke, das klingt nach dem, was ich brauche - ich überprüfe es, wenn ich Zugang zu einem Windows-Rechner bekomme. Würde sich das auf Unterbefehle auswirken, die Klammern verwenden? Greg vor 12 Jahren 0
@ Greg: Es scheint, dass `(` `)` Befehle nur zusammenfassen, sie aber immer noch im übergeordneten Kontext ausführen. `(setlocal & cd foo & bar)` funktioniert nicht; stattdessen wäre "pushd foo && (bar & popd)" erforderlich. grawity vor 12 Jahren 1
3
bahamat

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 
Ich habe die Frage aktualisiert, um klarzustellen, dass ich nach Windows Batch / Shell Scripting frage. Ich weiß, wie man es unter einer Sh-ähnlichen Schale macht :) Greg vor 12 Jahren 0
Wie BillP3rd auf das Äquivalent von ';' In Batch-Dateien ist '&'. Greg vor 12 Jahren 0
Ach, entschuldigung. Ihre Verwendung von Schrägstrichen ließ mich glauben, es sei UNIX. bahamat vor 12 Jahren 0
3
Timtech

Wie bereits erwähnt, pushd \windows && (foobar & popd)funktioniert Grawity besser als pushd \windows & foobar & popdweil letzteres möglicherweise fehlschlägt, wenn kein solches Verzeichnis vorhanden ist.

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

1
Scott

Ich begrüße den Vorschlag von grawity, setlocalan den Anfang Ihres Batch-Skripts zu setzen, aber ich würde die Tatsache hinzufügen, dass Sie mehrere, verschachtelte setlocal/ endlocalBlöcke haben können, so dass eine relevantere Antwort auf die Frage gegeben sein könnte

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

Und natürlich, wenn Sie den Befehl soll nur dann ausgeführt werden, wenn die cdzu dir2erfolgreich ist, sagen .cddir2&&command

Beachten Sie, dass der Block setlocal/ endlocaleine 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.

0
surfasb

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.