2013-03-27 10 views
9

Ich habe ein Szenario, in dem während der Ausführung einer Batch-Datei in einen anderen Ordner navigiert wird (zB zu "../asdf"); Am Ende der Ausführung wird das aktuelle Arbeitsverzeichnis als derselbe Ordner festgelegt, von dem der Benutzer die .bat-Datei aufgerufen hat.Wiederherstellen des Standard-Arbeitsverzeichnisses, wenn die Bat-Datei abrupt beendet wird

Aber wenn der Benutzer die Stapelverarbeitung beendet, bevor es abgeschlossen ist, zeigt die cmd das aktuelle Arbeitsverzeichnis (sagen Sie "../asdf").

Aber in meinem Fall muss ich das Arbeitsverzeichnis auf den Standard/vordefinierten wiederherstellen. Ist es möglich?

  • Batch-Datei wird von mir geschrieben, damit ich es ändern kann.
  • CMD wird über eine Desktopverknüpfung zu CMD geöffnet, über die ich die Kontrolle habe; Eigenschaften wie Arbeitsrichtung oder Weitergabe von Argumenten an CMD usw. können dort ausgeführt werden.
+0

Wenn der Benutzer den Stapel beendet, kann der Stapel den Standardordner nicht wiederherstellen. – Endoro

Antwort

25

Verwenden Sie in Ihrem Stapelscript setlocal, um die laufende Umgebung Ihrer Stapelsitzung zu kapseln. Wenn der Benutzer das Skript beendet, bevor Sie cd oder popd zurückgeben, wird Ihr Skript immer noch in dem Verzeichnis beendet, in dem es gestartet wurde. Hier ein kurzer Test:

@echo off 
setlocal 
pushd c:\Users 
cd 
exit /b 

Ausgang:

C:\Users\me\Desktop>test.bat 
c:\Users 

C:\Users\me\Desktop> 

Hinweis habe ich nicht popd oder cd %userprofile%\Desktop, aber ich landete immer noch zurück an meinem Desktop-up, nachdem das Skript beendet.

Darüber hinaus verhindert setlocal Ihre Umgebung mit verwaisten Variablen, die nichts außerhalb Ihres Batch-Skript bedeuten. Es ist nur eine gute Übung. Geben Sie an der Konsole help setlocal für weitere Informationen ein.

+0

+1. Ich dachte zuerst, dass du falsch liegst, aber es funktioniert! 'setlocal' speichert das aktuelle Verzeichnis und' endlocal' zurück, auch mit mehreren verschachtelten 'setlocal/endlocal' Paaren! Dieses Verhalten ist undokumentiert (getestet in Win-XP). Woher weißt du das? – Aacini

+1

@Aacini - Nur aus meinen eigenen Beobachtungen. Ich habe nicht über das Verschachteln von Setlocals nachgedacht, aber ich denke, es ist sinnvoll, dass Laufzeitumgebungen auf diese Weise verschachtelt werden können. – rojo

+0

+1, ich muss eine schwache Erinnerung haben: facepalm: – Endoro