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ąć?




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ą.


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"

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

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.


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%

%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.


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

2
OP pyta o skrypty powłoki BAT / CMD systemu Windows, a nie bash.
— Rivy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.