2013-03-27 17 views
9

Mam scenariusz, w którym podczas wykonywania pliku wsadowego przechodzi do innego folderu (powiedz do "../asdf"); a po zakończeniu wykonywania ustawi bieżący działający katalog jako ten sam folder, z którego użytkownik wywołał plik .bat.Przywróć domyślny katalog roboczy, jeśli plik bat zostanie nagle przerwany.

Ale jeśli użytkownik zakończy przetwarzanie wsadowe, zanim zostanie zakończone, cmd pokazuje bieżący działający katalog (powiedz "../asdf").

Ale w moim przypadku, muszę przywrócić działający katalog do domyślnego/predefiniowanego. Czy to możliwe?

  • Plik wsadowy został napisany przeze mnie, więc mogę go zmodyfikować.
  • CMD otwiera się przez skrót na pulpicie do CMD, nad którym mam kontrolę; więc właściwości takie jak działający katalog lub przekazywanie argumentów do CMD itp. mogą być tam wykonywane.
+0

Jeśli użytkownik zakończy wiązkę, partia nie może przywrócić domyślnego folderu. – Endoro

Odpowiedz

25

W swoim skrypcie wsadowym należy użyć setlocal, aby zamknąć środowisko uruchomieniowe sesji wsadowej. Jeśli użytkownik zakończy skrypt, zanim użytkownik zwróci go, Twój skrypt nadal będzie działał w katalogu, w którym został uruchomiony. Oto krótki sprawdzian:

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

wyjściowa:

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

C:\Users\me\Desktop> 

Wskazówka zrobiłem nie popd lub cd %userprofile%\Desktop, ale nadal skończyło się z powrotem na moim pulpicie po skrypt zakończył.

Dodatkowo, setlocal powstrzymuje Cię przed zbieraniem środowiska ze zmiennymi osieroconymi, które nie mają znaczenia poza skryptem wsadowym. To tylko dobra praktyka. Na konsoli wpisz help setlocal, aby uzyskać więcej informacji.

+0

+1. Początkowo myślałem, że się mylisz, ale działa! 'setlocal' przechowuje bieżący katalog i' endlocal' zwraca do niego, nawet z kilkoma zagnieżdżonymi parami 'setlocal/endlocal'! To zachowanie jest nieudokumentowane (testowane w środowisku Win-XP). Gdzie o tym wiesz? – Aacini

+1

@Aacini - Tylko z własnych obserwacji. Nie myślałem o zagnieżdżaniu setlocali, ale wydaje mi się, że sensowne jest, że środowiska wykonawcze mogą być zagnieżdżane w ten sposób. – rojo

+0

+1, muszę mieć słabe wspomnienie: facepalm: – Endoro