Co oznacza% ~ d0 w pliku wsadowym systemu Windows?

353

Patrzę na plik wsadowy, który definiuje następujące zmienne:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Co znaczy %~d0lub co %~p0właściwie oznacza?
  • Czy istnieje zestaw dobrze znanych wartości takich jak bieżący katalog, dysk, parametry skryptu?
  • Czy mogę użyć innych podobnych skrótów?
Chris Smith
źródło

Odpowiedzi:

539

Magiczne zmienne %n zawierają argumenty użyte do wywołania pliku: %0jest ścieżką do samego pliku nietoperza, %1jest pierwszym argumentem po, %2jest drugim i tak dalej.

Ponieważ argumentami są często ścieżki plików, istnieje dodatkowa składnia w celu wyodrębnienia części ścieżki. ~dto dysk, ~pto ścieżka (bez dysku), ~nto nazwa pliku. Można je łączyć, więc ~dpjest to dysk + ścieżka.

%~dp0 jest więc bardzo przydatny w nietoperzu: jest to folder, w którym znajduje się plik wykonywalny nietoperza.

Możesz także uzyskać inne rodzaje meta informacji o pliku: ~tjest znacznikiem czasu, ~zjest rozmiarem.

Poszukaj tutaj odwołania do wszystkich poleceń wiersza poleceń. Kody tyldy magia są opisane poniżej na .

JacquesB
źródło
15
Uwaga do siebie: echo %~dp0nie będzie działać w wierszu poleceń, tylko w pliku wsadowym. Hه!
northben
2
czy jest jakaś różnica między %~d0i %~d0%?
Geoffrey
2
@Pacerier:% 0 to pełna ścieżka wraz z nazwą pliku skryptu. % ~ dp0 to ścieżka do folderu zawierającego skrypt, ale z wyłączeniem nazwy pliku skryptu.
JacquesB
4
note to self: echo %~pd0daje to samo wyjście co echo %~dp0(zamiast odwrotnego zgodnie z oczekiwaniami). Ponadto wartość %0jest różna w zależności od tego, czy klikniesz dwukrotnie plik wsadowy, czy uruchomisz go z cmd.
Pacerier
152

Są to ulepszone podstawienia zmiennych. Modyfikują zmienne% N używane w plikach wsadowych. Bardzo przydatne, jeśli lubisz programować wsadowo w systemie Windows.

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

Możesz znaleźć powyższe, uruchamiając FOR /?.

efotinis
źródło
48

Tak, istnieją inne skróty, których możesz użyć, które są podane poniżej. W twoim poleceniu ~ d0 oznaczałoby literę napędu 0. argumentu.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Ponieważ 0-tym argumentem jest ścieżka skryptu, otrzymuje ona literę dysku ścieżki. Możesz także użyć następujących skrótów.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 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    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Można to również znaleźć bezpośrednio w wierszu polecenia po uruchomieniu CALL /? albo za /?

Clewaks
źródło
9

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.

Dla #oneLinerLovers cd /d %~dp0zmieni zarówno dysk, jak i katalog :)

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

Marvin Thobejane
źródło
7
Inną opcją jest to pushd %~dp0, że nie ma problemu ze zmianą bieżącego dysku i daje dodatkową korzyść z możliwości popdpowrotu do oryginalnego dysku / ścieżki później.
bcrist
7

%~d0daje literę dysku argumentu 0 (nazwa skryptu), %~p0ścieżkę.

Armin Ronacher
źródło
6

Niektórzy muszą uważać na:

Po dwukrotnym kliknięciu plik wsadowy %0zostanie otoczony cudzysłowami. Na przykład, jeśli zapiszesz ten plik jako c:\test.bat:

@echo %0
@pause

Dwukrotne kliknięcie spowoduje otwarcie nowego wiersza polecenia z danymi wyjściowymi:

"C:\test.bat"

Ale jeśli najpierw otworzysz wiersz polecenia i wywołasz go bezpośrednio z tego wiersza polecenia, %0odniesie się do dowolnego wpisanego tekstu . Jeśli wpiszesz test.batEnter, wynik nie %0będzie zawierał cudzysłowów, ponieważ nie wpisałeś cudzysłowów:

c:\>test.bat
test.bat

Jeśli wpiszesz testEnter, wyjście %0również nie będzie miało rozszerzenia, ponieważ nie wpisałeś żadnego rozszerzenia:

c:\>test
test

To samo dla tEsTEnter:

c:\>tEsT
tEsT

Jeśli wpiszesz "test"Enter, wynik %0będzie zawierał cudzysłowy (ponieważ je wpisałeś), ale bez rozszerzenia:

c:\>"test"
"test"

Wreszcie, jeśli wpiszesz "C:\test.bat", wynik będzie dokładnie tak, jakbyś go dwukrotnie kliknął:

c:\>"C:\test.bat"
"C:\test.bat"

Pamiętaj, że nie są to wszystkie możliwe wartości, %0ponieważ możesz wywołać skrypt z innych folderów:

c:\some_folder>/../teST.bAt
/../teST.bAt

Wpłynie to również na wszystkie powyższe przykłady %~0, ponieważ dane wyjściowe %~0to po prostu dane wyjściowe %0 cudzysłowów (jeśli występują).

Pacerier
źródło
3

Ten kod wyjaśnia użycie znaku ~ tilda, co było dla mnie najbardziej mylące. Kiedy to zrozumiem, znacznie łatwiej zrozumieć:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
djangofan
źródło
1

Wyświetla bieżącą lokalizację pliku lub katalogu, w którym aktualnie się znajdujesz. Na przykład; jeśli plik wsadowy znajduje się w katalogu pulpitu, wówczas „% ~ dp0” wyświetli katalog pulpitu. jeśli chcesz, aby wyświetlał bieżący katalog z bieżącą nazwą pliku, możesz wpisać „% ~ dp0% ~ n0% ~ x0”.

zask
źródło
Lepiej byłoby użyć „% ~ dpnx0”
FrinkTheBrave