Jak uzyskać ścieżkę skryptu wsadowego w systemie Windows?

329

wiem to %0 zawiera pełną ścieżkę skryptu wsadowego, npc:\path\to\my\file\abc.bat

Byłbym pathrównyc:\path\to\my\file

Jak mogłem to osiągnąć?

Misza Moroszko
źródło
1
BTW:% 0 nie zawiera pełnej ścieżki, jeśli nietoperz jest wywoływany za pomocą względnej linii poleceń. Zatem „% ~ dpf0” byłoby bardziej niezawodne w tym przypadku.
eckes

Odpowiedzi:

562

%~dp0będzie katalog. Oto dokumentacja wszystkich modyfikatorów ścieżki . Zabawne rzeczy :-)

Aby usunąć końcowy ukośnik odwrotny, możesz użyć :n,mskładni podciągów:

SET mypath=%~dp0
echo %mypath:~0,-1%

Niestety nie wierzę, że istnieje sposób na połączenie %0składni ze :~n,mskładnią.

Dean Harding
źródło
7
Doskonale ... korzystałem %~0\..- wiedziałem, że musi być lepszy sposób! Ponadto prawdopodobnie będziesz chciał zawrzeć %~dp0w cudzysłowie ( "") w przypadku spacji w nazwie katalogu itp.
Cameron
1
Miły ! Ale %~dp0zawiera `` na końcu. Czy masz pomysł, jak go usunąć?
Misha Moroshko
1
@Misha: Zakładam, że masz na myśli sposób usunięcia „\” na końcu. Zaktualizowałem swoją odpowiedź ze szczegółami.
Dean Harding
2
Przykład w odpowiedzi działa dobrze bez cudzysłowów, nawet jeśli na ścieżce jest spacja. (np. SET msg=hello worlddziała dobrze). Jednak używając% mypath% w innym miejscu, należy zachować ostrożność, używając go w cudzysłowach, chociaż nie są one potrzebne do cdżadnego z nich.
Martin Pain
2
Ten link ma teraz 404
StingyJack
12

Możesz użyć następującego skryptu, aby uzyskać ścieżkę bez ciągnięcia „\”

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
duan
źródło
Nie powoduje to jednak usunięcia nazwy pliku ze ścieżki (np. Abc.txt w przykładzie OP).
dcp,
4
@dcp Er, to prawda.
Kyle Strand
@Kyle Strand - Tak, właśnie spróbowałem ponownie i teraz działa dobrze. Nie jestem pewien, co się stało, kiedy wypróbowałem to na początku, może popełniłem błąd gdzieś w skrypcie. Przepraszamy za zamieszanie i dziękuję za zwrócenie na to uwagi.
dcp
11

%~dp0może być ścieżką względną. Aby przekonwertować go na pełną ścieżkę, spróbuj czegoś takiego:

pushd %~dp0
set script_dir=%CD%
popd
Arnaud
źródło
6
Ok, więc dlaczego nie użyć %~dp0bezpośrednio?
jpaugh
5
Gorzej wersja zaakceptowanej odpowiedzi, opublikowana 5 lat później? Nie rozumiem.
Kyle Strand
Wyobrażam sobie, że zostało to opublikowane w celu rozwiązania problemu wymienionego w komentarzach przyjętej odpowiedzi - %~dp0może być względne, co może, ale nie musi być problemem, w zależności od przypadku użycia
Michael Mrozek
10
%~dp0nie może zawierać ścieżki względnej, doznacza dysk i pścieżkę, w jaki sposób dysk może być względny?
jeb
5
W jakim świecie Właśnie przetestowałem tę odpowiedź na Windows Server 2012 R2 i okazuje się, %~dp0że będzie to ścieżka bezwzględna, nawet jeśli skrypt został uruchomiony jako ścieżka względna. Dzięki komentarzowi jeba ta odpowiedź mnie nie zmyliła. Dlaczego ludzie po prostu coś wymyślają i zaczynają szerzyć swoją dziką wyobraźnię na innych. Mam tego kolegę, który to robi, ale winiłem jego (młody) wiek. Chciałbym, żeby moje głosowanie w głosowaniu się liczyło.
bitoolean
0

Możesz użyć %~dp0, d oznacza tylko dysk, p oznacza tylko ścieżkę, 0 to argument pełnej nazwy pliku wsadowego.

Na przykład, jeśli ścieżka do pliku to C: \ Users \ Oliver \ Desktop \ example.bat, wówczas argument byłby równy C: \ Users \ Oliver \ Desktop \, również możesz użyć polecenia set cpath=%~dp0 && set cpath=%cpath:~0,-1%i użyć %cpath%zmiennej, aby usunąć końcowy ukośnik.

Hayz
źródło
1
Nie widzę więcej informacji niż w 9-letniej odpowiedzi
jeb
Dodatkowe informacje to „d oznacza tylko napęd…” itd. Dziękujemy, @Hayz.
RJ Dunnill,
-2

%cd% poda ścieżkę do katalogu, z którego skrypt jest uruchomiony.

Po prostu biegnij:

echo %cd%
Uddalak Biswas
źródło
%CD%to bieżący folder roboczy, a nie folder, w którym przechowywany jest plik wsadowy. Mogą być w tej samej lokalizacji, ale często nie są.
Stephan
-7

To byłaby %CD%zmienna.

@echo off
echo %CD%

%CD% zwraca bieżący katalog, w którym znajduje się skrypt wsadowy.

Ruel
źródło
35
% cd% zwraca katalog, z którego skrypt został uruchomiony, a nie katalog, w którym znajduje się skrypt.
Misha Moroshko 30.09.10
4
działa tylko wtedy, gdy skrypt nie modyfikuje katalogu roboczego. Spróbuj CD C:\Temp <CR> ECHO %CD%( <CR>nowa linia ...)
Dean Harding
6
Ponadto, jeśli klikniesz skrypt prawym przyciskiem myszy i wybierzesz „Uruchom jako administrator”, bieżący katalog początkowy to C: \ Windows \ System32 niezależnie od tego, gdzie znajduje się skrypt.
Cameron
Chociaż nie jest to bezpośrednia odpowiedź na pytanie OP, ten smak funkcjonalności jest dokładnie tym, czego szukałem, kiedy znalazłem to pytanie. Dzięki!
Zoltán
Żadne z innych opublikowanych rozwiązań nie działa dla mnie na Win7 32bit cmd.exe, jest to dla mnie przynajmniej przydatne.
Clifford,
-8

Pracuję na komputerze z systemem Windows 7 i wykorzystałem poniższe linie, aby uzyskać bezwzględną ścieżkę folderu dla mojego skryptu bash.

Dotarłem do tego rozwiązania po przejrzeniu http://www.linuxjournal.com/content/bash-parameter-expansion .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder
Jonas
źródło
2
OP pyta o skrypty powłoki BAT / CMD systemu Windows, a nie bash.
Rivy