Pytanie Wiersz poleceń .cmd / .bat, jak zdobyć katalog uruchomionego skryptu


Jak uzyskać katalog skryptu, który został uruchomiony i użyć go w pliku .cmd?


76
2017-09-24 21:32


pochodzenie


możliwy duplikat Jak uzyskać ścieżkę skryptu wsadowego w systemie Windows? - Celada


Odpowiedzi:


Raymond Chen ma kilka pomysłów:

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

Cytowane tutaj w całości, ponieważ archiwa MSDN wydają się być nieco niewiarygodne:

Łatwym sposobem jest użycie %CD% pseudo-zmienna. Rozszerza się do   aktualny katalog roboczy.

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

(Oczywiście, zapisanie / przywrócenie katalogu może być łatwiejsze   skończyłem pushd/popd, ale nie o to tutaj chodzi.)

The %CD% trick jest przydatny nawet z linii poleceń. Na przykład ja   często znajduję się w katalogu, w którym jest plik, który chcę   operować dalej, ale ... oh, potrzebuję chdir do jakiegoś innego katalogu po kolei   wykonać tę operację.

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

(Lubię używać %_% jako moją zmienną środowiska scratch.)

Rodzaj SET /? aby zobaczyć inne pseudo-zmienne dostarczone przez polecenie   edytor.

Również komentarze w artykule są warte skanowania, na przykład tego:

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 

%0 to nazwa pliku wsadowego. ~dp daje napęd i ścieżkę   podany argument.


55
2017-09-24 21:34



To nie odpowiada na pytanie. % CD% podaje bieżący katalog, a tym, co zostało zadane, jest katalog skryptu. - ketorin
@ketorin: To ROBI Odpowiedz na pytanie. % CD% zmieni się, jeśli sam skrypt zmieni katalog w trakcie jego użytkowania (pushd / cd / ..), ale % ~ dp0 będzie NIE zmienić i zawsze wskazywać lokalizację skryptu. - Jay
-1 Nie wiem, czy to odpowiada na pytanie, czy nie. Czy możesz pokazać mi przykład? - Iain Samuel McLean Elder
@IainElder - prawdopodobnie masz rację, ponownie odwiedziłem tę odpowiedź kilka dni temu i nie byłem z niej zadowolony. Komentarze na blogu Raymonda Chena, o których wspominałem, zdają się być wywołane przez MS - tak więc istnieją zagrożenia odpowiedzi, które opierają się wyłącznie na połączonych zewnętrznych źródłach. Próbowałem znaleźć jakiś inny materiał, który poparłby moją odpowiedź, ale teraz jest tak dawno temu w mgle czasu. Zgłaszanie do usunięcia. Dziękuję za to, że zarekwirowałeś mnie tym razem :) Nie pracujesz dla SkyScannera, prawda? - Kev
@Kev Dobrze jest odwoływać się do zewnętrznych źródeł, jeśli skopiujesz pomocną część do Stack Overflow. Chyba teraz jest już za późno! I tak, wiem, że czai się w centrum danych Skyscanner ;-) - Iain Samuel McLean Elder


Jest to odpowiednik ścieżki skryptu:

%~dp0

Używa to składni rozszerzenia wsadowego parametru. Parametr 0 jest zawsze samym skryptem.

Jeśli twój skrypt jest przechowywany w C:\example\script.bat, następnie %~dp0 ocenia na C:\example\.

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

Możesz uzyskać wartość dowolnego parametru, używając% i następującej po nim pozycji numerycznej w wierszu poleceń.

[...]

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

[...]

% ~ d1 Rozwiń% 1 tylko na literę dysku - C:

[...]

% ~ p1 Rozwiń% 1 tylko do ścieżki, np. \ utils \ to zawiera znak końcowy \, który może być interpretowany jako znak escape za pomocą niektórych poleceń.

[...]

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

% ~ dp1 Rozwiń% 1 tylko na literę dysku i ścieżkę

[...]

Możesz uzyskać ścieżkę do skryptu wsadowego z% 0, można do niego zastosować rozszerzenia parametrów, więc% ~ dp0 zwróci Dysk i Ścieżkę do skryptu wsadowego, np. W: \ scripts \


138
2017-09-24 21:38



Dokładnie to, czego potrzebowałem. I połączyłem ten blog z moim blogiem jako przypomnienie :) - Olivier H
Nie jestem pewien, czy jest to błąd / błąd w cytowanym tekście, ale w moim skrypcie potrzebuję "% ~ d0", aby otrzymać literę dysku! % ~ d1 jest pusty w moim przypadku. - eftokay83
W moich oczach / sytuacji jest to lepsze od przyjętej odpowiedzi. Jeśli uruchomisz skrypt wiersza poleceń "jako Administrator" (prawy przycisk myszy), twój skrypt zostanie uruchomiony z Windows \ system32. Zaakceptowana odpowiedź NIE da ci lokalizacji skryptu, da ci system Windows \ system32 ponownie. To znaczy. NINIEJSZA odpowiedź pomoże ci to naprawić, uruchamiasz skrypt z cd% ~ dp0 - Jaroslav Záruba


for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d

pushd %curdir%

Źródło


1
2017-12-23 17:06