Jeśli w skryptach powłoki muszę uruchomić polecenie z katalogu, możemy użyć podpowłoki, aby upewnić się, że wrócę do pierwotnego kontekstu:
(cd temporary/new/directory ; command)
# now I am still in original directory
Czy można to zrobić w plikach wsadowych systemu Windows (lub plikach cmd)
Robienie tego samego w plikach wsadowych pozostawia mnie w nowym katalogu.
Mogę zrobić:
pushd temporary\new\directory && command && popd
Ale tata zależy od sukcesu command
.
Jakieś pomysły?
Odpowiedzi:
Jeśli zrobisz:
pozostaniesz (jak twierdzisz) w folderze \ windows. Próbować:
i powinieneś znaleźć się tam, gdzie zacząłeś.
źródło
cd
/pushd
czasem się nie udaje (na przykład, jeśli katalog nie istnieje).pushd \windows && (foobar & popd)
może być bardziej niezawodnyDomyślnie pliki wsadowe systemu Windows są uruchamiane w kontekście powłoki nadrzędnej (co jest niezwykłe dla użytkowników Uniksa, gdzie
source
konieczne jest użycie jawnego , ale było to jedyną możliwością w MS-DOS). Oznacza to, że zmiany katalogów i zmienne środowiskowe również wpływają na oryginalną powłokę interaktywną.Umieść
setlocal
na górze skryptu, aby działał we własnym kontekście - wtedy możesz bezpiecznie korzystaćcd
ze skryptu.źródło
(
)
tylko polecenia grupują razem, ale nadal uruchamiają je w kontekście nadrzędnym.(setlocal & cd foo & bar)
nie będzie działać; zamiast tegopushd foo && (bar & popd)
byłoby potrzebne.Jak już wcześniej wspomniano grawitacja,
pushd \windows && (foobar & popd)
działałaby lepiej niżpushd \windows & foobar & popd
dlatego, że ta ostatnia może zawieść, jeśli nie ma takiego katalogu.Ponadto używanie
setlocal
iendlocal
pozwala mieć wiele lokalnych środowisk, więc na przykład możesz mieć:setlocal
cd dir
command
endlocal
Teraz wrócisz do oryginalnego katalogu.
źródło
Możesz użyć,
cd -
aby wrócić do poprzedniego katalogu roboczego. I użyj;
zamiast&&
, wtedy kolejne polecenia nie będą zależeć od powodzenia poprzednich poleceń.źródło
Pochwalam sugestię grawitacji, aby umieścić
setlocal
na początku skryptu wsadowego, ale dodam fakt, że możesz mieć wiele, zagnieżdżonychsetlocal
/endlocal
bloków, więc bardziej trafną odpowiedzią na pytanie może byćI, oczywiście, jeśli chcesz polecenie należy wykonać tylko wtedy, gdy
cd
siędir2
to uda, powiedzmy .cd
dir2
&&
command
Zauważ, że
setlocal
/endlocal
block tworzy zlokalizowane środowisko, więc wszelkie zmienne, które ustawisz lub zmienisz w takim bloku, powrócą do poprzedniej wartości poendlocal
.źródło
Możesz zapisać bieżący katalog w zmiennej. Zmień i cofnij w zależności od zwracanej wartości polecenia. BTW,% CD% zwraca bieżący DIR.
źródło