Co oznacza% ~ dp0 i jak to działa?

1022

Uważam, że jest %~dp0bardzo przydatny i często go używam, aby moje pliki wsadowe były bardziej przenośne.

Ale sama etykieta wydaje mi się bardzo tajemnicza ... Co ~robi? Czy dpoznacza dysk i ścieżkę? Czy 0odnosi się do %0ścieżki do pliku wsadowego zawierającego nazwę pliku?

Czy to tylko dziwna etykieta?

Chciałbym również wiedzieć, czy jest to udokumentowana funkcja, czy coś skłonnego do przestarzałości.

Sebastián Grignoli
źródło
2
Masz rację, Hellen. To pytanie nie pojawiło się, gdy szukałem% ~ dp0. Może dlatego, że ma w tytule% ~ d0 zamiast% ~ dp0.
Sebastián Grignoli
9
SymbolHound doskonale nadaje się do wyszukiwania innych znaków niż alfanumeryczne. Na przykład wyszukaj%~dp0 . Zwykle uważam, że najpopularniejsze hity odnoszą się do treści na SO.
DavidRR
SymbolHound nie działał dla mnie z wyszukiwaniem symbolhound.com/?q=%25~dp0 . Jednak to zadziałało: google.com/search?q=%25~dp0 - tylko mówię ...
Kristopher
1
SymbolHound 2019: nie działa, a uMatrix wskazuje, że łączy się z witrynami stron trzecich, takimi jak blockchain.info i paypalobjects.com.
Nils Lindemann,

Odpowiedzi:

810

Powołanie

for /?

w wierszu poleceń podaje pomoc na temat tej składni (której można również użyć poza FOR, jest to tylko miejsce, w którym można znaleźć pomoc).

Ponadto ulepszono podstawianie odwołań do zmiennych FOR. Możesz teraz użyć następującej opcjonalnej składni:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Modyfikatory można łączyć, aby uzyskać złożone wyniki:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

W powyższych przykładach% I i PATH można zastąpić innymi prawidłowymi wartościami. Składnia% ~ jest zakończona prawidłową nazwą zmiennej FOR. Wybór nazw zmiennych, takich jak% I, czyni je bardziej czytelnymi i pozwala uniknąć pomyłek z modyfikatorami, które nie rozróżniają wielkości liter.

Można użyć różnych liter, takich jak f„pełna nazwa ścieżki”, dlitera dysku, pścieżka i można je łączyć. %~jest początkiem każdej z tych sekwencji, a liczba Ioznacza, że ​​działa on na parametrze %I(gdzie %0jest pełna nazwa pliku wsadowego, tak jak zakładałeś).

schnaader
źródło
2
Nie wiem o nikim innym, ale otrzymuję komunikat „Poniższe użycie operatora ścieżki w podstawianiu parametrów wsadowych jest nieprawidłowe. W przypadku prawidłowych formatów wpisz CALL /? Lub FOR / ?. Składnia polecenia jest niepoprawna.” podczas używania I. Muszę użyć 0zamiast I. Nie wiem, czy coś przeoczyłem, ale po prostu daję znać ludziom.
mythofechelon
71
@BenHooper, Ijest symbolem zastępczym dla indeksu zmiennej. 0= plik wywołujący, 1= argument nr 1, 2= argument nr 2 itp.
Chris
9
Ta odpowiedź jest dobra. I wyczerpujący. Dla
odrobiny
1
Ta odpowiedź jest nieco myląca, ponieważ tych podstawień można używać poza FOR.
David
346

(Po pierwsze, chciałbym polecić tę przydatną stronę referencyjną dla partii: http://ss64.com/nt/ )

Potem jeszcze jedno przydatne wyjaśnienie: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

Zmienna% ~ dp0

Wartość% ~ dp0 (czyli zero), gdy zmienna odwoływać w pliku wsadowym systemu Windows wzrośnie do d rive litery i p ath tego pliku wsadowego.

Zmienne% 0–% 9 odnoszą się do parametrów wiersza poleceń pliku wsadowego. % 1-% 9 odnoszą się do argumentów wiersza poleceń po nazwie pliku wsadowego. % 0 odnosi się do samego pliku wsadowego.

Jeśli podążysz za znakiem procentu (%) ze znakiem tyldy (~), możesz wstawić modyfikator (y) przed numerem parametru, aby zmienić sposób rozwijania zmiennej. Modyfikator d rozwija się do litery napędu, a modyfikator p rozwija się do ścieżki parametru.

Przykład: załóżmy, że masz katalog w C: o nazwie bat_files, aw tym katalogu znajduje się plik o nazwie example.bat. W tym przypadku% ~ dp0 (łącząc modyfikatory dip) rozwinie się do C: \ bat_files.

Pełne wyjaśnienie znajduje się w tym artykule Microsoft .

Sprawdź także ten wątek na forum .

I bardziej jasne odniesienie stąd :

  • %CmdCmdLine% zwróci cały wiersz poleceń przekazany do CMD.EXE

  • %* zwróci pozostałą część wiersza poleceń, zaczynając od pierwszego argumentu wiersza poleceń (w Windows NT 4% * obejmuje również wszystkie spacje wiodące)

  • %~dn zwróci literę dysku% n (n może wynosić od 0 do 9), jeśli% n jest prawidłową ścieżką lub nazwą pliku (bez UNC)

  • %~pn zwróci katalog% n, jeśli% n jest prawidłową ścieżką lub nazwą pliku (brak UNC)

  • %~nn zwróci tylko nazwę pliku% n, jeśli% n jest prawidłową nazwą pliku

  • %~xn zwróci rozszerzenie pliku tylko% n, jeśli% n jest prawidłową nazwą pliku

  • %~fn zwróci pełną ścieżkę% n, jeśli% n jest prawidłową nazwą pliku lub katalogu

DODAJ 1

Właśnie znalazłem dobre referencje dla tajemniczego ~ operatora tyldy.

%~Ciąg nazywa procent tyldy operatora. Można go znaleźć w takich sytuacjach: %~0.

:~Ciąg nazywa dwukropek tyldy operatora. Możesz to znaleźć jak %SOME_VAR:~0,-1%.

DODAJ 2 - 13:12 7/6/2018

%1-%9odnoszą się do argumentów wiersza poleceń. Jeśli nie są one prawidłowymi wartościami ścieżki, %~dp1- %~dp9wszystkie rozwiną się do tej samej wartości co %~dp0. Ale jeśli poprawnymi wartościami ścieżki, zostaną rozwinięte do własnych wartości sterownika / ścieżki.

Na przykład: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Uruchom 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Uruchom 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
smwikipedia
źródło
Również ciekawy tej koncepcji i znalazł dobre wyjaśnienie tutaj. Dzięki Mingge. ^ _ ^
Eugene
1
dla mnie rozwija się do c: \ bat_files \ (z separatorem ścieżki spływu)
Mikołaj
Linki do artykułu Microsoft i wątku na forum już nie działają :(
wovano
150

Zmienna %0w skrypcie wsadowym jest ustawiona na nazwę wykonującego pliku wsadowego.

~dpSpecjalna składnia pomiędzy %i 0mówi zasadniczo rozszerzyć zmienną %0pokazać literę dysku i ścieżkę, co daje bieżący katalog zawierający plik wsadowy!

Pomoc = Link

Andy White
źródło
@Andy, czy jest jakiś sposób na przetestowanie %0bezpośrednio w cmd bez zapisywania pliku .bat na lokalnym dysku twardym?
Pacerier
Link jest zepsuty i nie mogę znaleźć poprawnego linku. Oczekująca edycja nadal ma uszkodzony link.
George_E
44

% ~ dp0 rozwija się do bieżącej ścieżki katalogu działającego pliku wsadowego.

Aby uzyskać jasne zrozumienie, stwórzmy plik wsadowy w katalogu.

C: \ script \ test.bat

z zawartością:

@echo off
echo %~dp0

Po uruchomieniu z wiersza polecenia zobaczysz następujący wynik:

C: \ script \

zero
źródło
40

Inną wskazówką, która bardzo by pomogła, jest to, że aby ustawić bieżący katalog na inny dysk , należy %~d0najpierw użyćcd %~dp0 . Spowoduje to zmianę katalogu na dysk pliku wsadowego, a następnie na jego folder.

Alternatywnie, dla #oneLinerLovers, jak wskazał @Omni w komentarzach cd /d %~dp0 , zmieni zarówno dysk, jak i katalog :)

Mam nadzieję, że to komuś pomoże.

Marvin Thobejane
źródło
22
cdma wbudowany parametr, który przełączy zarówno dysk, jak i folder:cd /d %~dp0
OmnipotentEntity
2
Masz rację i /dargument jest pomocny, ale zasługuje na to, aby zamieścić go jako alternatywną odpowiedź dla kandydata, a nie komentarz do tego. Dziękuję za zwrócenie na to uwagi, nie wiedziałem o tym :)
Marvin Thobejane,
4
możesz również użyć '' pushd% ~ dp0 '', aby przełączyć dysk i folder
fmuecke
25

Świetny przykład z przenośnego launchera Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

Nie jestem pewien, co robi sam minus 1, ale to działa na ucztę!

HansBKK
źródło
11
+1 bardzo przydatne. Instrukcja if sprawdza, czy występuje ukośnik odwrotny i usuwa ukośnik, jeśli to konieczne. Ujemna 1 w warunku wyodrębnia ostatni znak, a wyrażenie w instrukcji set przyjmuje ciąg ścieżki minus ostatni znak (który jest odwrotnym ukośnikiem).
Matt
1
ujemna 1 to minus ostatni znak. Czytaj zmienne podciągi
phuclv
12

Przykład byłby miły - oto banalny

for %I in (*.*) do @echo %~xI

wyświetla tylko ROZSZERZENIA każdego pliku w bieżącym folderze

dla bardziej przydatnych kombinacji zmiennych (wymienionych również w poprzedniej odpowiedzi) z monitu CMD wykonaj: HELP FOR który zawiera ten fragment

Modyfikatory można łączyć, aby uzyskać złożone wyniki:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line
Admin
źródło
Dostałem „~ xW tym momencie byłem nieoczekiwany”. wypróbowanie przykładu - czy to dlatego, że używam Win 7?
rozdział3
To dobra informacja, ale nie odnosi się do oryginalnego postu.
De Shan Baptiste