Skrypt wiersza poleceń .cmd / .bat, jak uzyskać katalog z uruchomionym skryptem

Odpowiedzi:

58

Raymond Chen ma kilka pomysłów:

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

Cytowane tutaj w całości, ponieważ archiwa MSDN są raczej zawodne:

Najłatwiejszym sposobem jest użycie %CD%pseudozmiennej. Rozwija się do bieżącego katalogu roboczego.

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(Oczywiście zapisywanie / przywracanie katalogu można było łatwiej wykonać za pomocą pushd/popd , ale nie o to tutaj chodzi.)

%CD%Sztuką jest przydatny nawet z linii poleceń. Na przykład często znajduję się w katalogu, w którym jest plik, na którym chcę operować, ale ... och, muszę przejść do innego katalogu, aby wykonać tę operację.

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(Lubię używać %_% jako mojej zmiennej środowiskowej scratch).

Wpisz, SET /?aby zobaczyć inne pseudozmienne udostępniane przez procesor poleceń.

Również komentarze w artykule są warte przeskanowania, na przykład ten (przez WayBack Machine, ponieważ komentarze zniknęły ze starszych artykułów):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

Obejmuje to użycie% ~ dp0:

Jeśli chcesz wiedzieć, gdzie znajduje się plik wsadowy: %~dp0

%0to nazwa pliku wsadowego. ~dppodaje dysk i ścieżkę podanego argumentu.

Kev
źródło
13
To nie odpowiada na pytanie. % CD% podaje aktualny katalog, podczas gdy pytano o katalog skryptu.
ketorin
3
@ketorin: To robi odpowiedzieć na pytanie. % CD% zmieni jeśli sam skrypt zmienić katalog całej To użytkowania (pushd / cd / ..), ale % ~ dp0 będzie nie zmieni i zawsze punkt do miejsca, gdzie znajduje się skrypt.
Jay
-1 Nie wiem, czy to odpowiada na pytanie, czy nie. Czy możesz pokazać mi przykład?
Iain Samuel McLean Elder
1
@IainElder - prawdopodobnie masz rację, ponownie odwiedziłem tę odpowiedź kilka dni temu i nie byłem z niej zbyt zadowolony. Wydaje się, że komentarze na blogu Raymonda Chena, do którego się odwołuję, zostały zaatakowane przez stwardnienie rozsiane - więc na tym polega niebezpieczeństwo odpowiedzi, które opierają się wyłącznie na połączonych źródłach zewnętrznych. Próbowałem znaleźć jakiś inny materiał na poparcie mojej odpowiedzi, ale jest to tak dawno temu, w mgle czasu. Zgłaszanie do usunięcia. Dzięki za przechylenie mnie na krawędzi tym razem :) Nie pracujesz w SkyScanner, prawda?
Kev,
1
@Kev Jeśli skopiujesz pomocną część do Stack Overflow, możesz odwoływać się do zewnętrznych źródeł. Myślę, że teraz jest już za późno! I tak, byłem znany z tego, że czaiłem się w centrum danych Skyscanner ;-)
Iain Samuel McLean Elder
147

Jest to odpowiednik ścieżki do skryptu:

%~dp0

Używa składni rozszerzenia parametru wsadowego. Parametr 0 to zawsze sam skrypt.

Jeśli twój skrypt jest przechowywany pod adresem C:\example\script.bat, to %~dp0obliczaC:\example\ .

ss64.com zawiera więcej informacji na temat składni rozszerzenia parametru. Oto odpowiedni fragment:

Możesz uzyskać wartość dowolnego parametru, używając%, po którym następuje jego pozycja numeryczna w wierszu poleceń.

[…]

Gdy parametr jest używany do podania nazwy pliku, można zastosować następującą rozszerzoną składnię:

[…]

% ~ d1 Rozwiń% 1 tylko do litery dysku - C:

[…]

% ~ p1 Rozwiń% 1 tylko do ścieżki, np. \ utils \ zawiera końcowy znak \, który może być interpretowany jako znak zmiany znaczenia przez niektóre polecenia.

[…]

Powyższe modyfikatory można łączyć:

% ~ dp1 Rozwiń% 1 tylko do litery dysku i ścieżki

[…]

Możesz uzyskać ścieżkę do samego skryptu wsadowego za pomocą% 0, można do tego zastosować rozszerzenia parametrów, aby% ~ dp0 zwrócił dysk i ścieżkę do skryptu wsadowego, np. W: \ scripts \

Landon
źródło
Dokładnie to, czego potrzebowałem. I połączyłem tę odpowiedź z moim blogiem, dla przypomnienia :)
Olivier H
Nie jestem pewien, czy jest to błąd / błąd w cytowanym tekście, ale w moim skrypcie potrzebuję "% ~ d0", aby uzyskać literę dysku! % ~ d1 jest w moim przypadku pusty.
fklappan
Moim zdaniem / sytuacja jest lepsza od przyjętej odpowiedzi. Jeśli uruchomisz skrypt wiersza poleceń „jako Administrator” (kliknij go prawym przyciskiem myszy), Twój skrypt zostanie wykonany z systemu Windows \ system32. Zaakceptowana odpowiedź NIE poda lokalizacji skryptu, ale ponownie poda Windows \ system32. To znaczy, ta odpowiedź pomoże ci to naprawić, zaczynasz swój skrypt od cd% ~ dp0
Jaroslav Záruba
0
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d

pushd %curdir%

Źródło

Alex. S.
źródło
Brak wystarczającej dokumentacji lub uzasadnienia.
BenPen,