Co oznacza % ~ d0 w pliku wsadowym systemu Windows?

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

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • co właściwie oznacza %~d0 lub %~p0?
  • czy istnieje zestaw znanych wartości takich jak bieżący katalog, dysk, parametry skryptu?
  • czy są jakieś inne podobne skróty, których mógłbym użyć?
Author: StackzOfZtuff, 2008-09-22

9 answers

Magiczne zmienne %n zawiera argumenty użyte do wywołania pliku: %0 jest ścieżką do samego pliku bat, {[2] } jest pierwszym argumentem po, %2 jest drugim i tak dalej.

Ponieważ argumenty są często ścieżkami plików, istnieje dodatkowa składnia do wyodrębniania części ścieżki. ~d to napęd, {[5] } to ścieżka (bez napędu), {[6] } to nazwa pliku. Można je łączyć tak, że ~dp to napęd+ścieżka.

%~dp0 jest więc całkiem przydatna w nietoperzu: to jest folderem, w którym znajduje się wykonujący plik bat.

Możesz również uzyskać inne meta informacje o pliku: ~t to znacznik czasu, ~z to Rozmiar.

Spójrz tutaj dla odniesienia dla wszystkich poleceń wiersza poleceń. Kody magii tyldy są opisane w dla .

 454
Author: JacquesB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:27:18

Są to wzmocnione substytucje zmiennych. Modyfikują zmienne % N używane w plikach wsadowych. Bardzo przydatne, jeśli jesteś do programowania wsadowego 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 /?.

 130
Author: efotinis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 00:12:12

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

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

Ponieważ 0-ty argument jest ścieżką skryptu, otrzymuje on za Ciebie literę dysku ścieżki. Możesz również 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 wywołania /? czy dla /?

 42
Author: Clewaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 20:49:21

Od parsowanie nazw plików w pliku wsadowym i więcej idiomów-Real ' s How-to:

Ścieżka (bez napędu) gdzie znajduje się skrypt: ~p0

Dysk, w którym znajduje się skrypt: ~d0

 9
Author: William Keller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 10:15:43

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

Dla # onelinerovers, cd /d %~dp0 zmieni zarówno dysk jak i katalog :)

Mam nadzieję, że to komuś pomoże.
 7
Author: Marvin Thobejane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-23 09:27:06

%~d0 podaje literę napędu argumentu 0 (nazwę skryptu), %~p0 ścieżkę.

 6
Author: Armin Ronacher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 20:44:20

Niektóre gotchas uważać na:

Jeśli klikniesz dwukrotnie plik wsadowy %0 zostanie otoczony cudzysłowami. Na przykład, jeśli zapiszesz ten plik jako c:\test.bat:

@echo %0
@pause

Podwójne kliknięcie otworzy nowy wiersz polecenia z wyjściem:

"C:\test.bat"

Ale jeśli najpierw otworzysz wiersz polecenia i wywołasz go bezpośrednio z tego wiersza polecenia, %0 będzie odnosić się do tego, co wpisałeś . Jeśli wpiszesz test.batwpisz , wyjście %0 nie będzie miało cytaty, ponieważ nie wpisałeś żadnych cytatów:

c:\>test.bat
test.bat

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

c:\>test
test

To samo dla tEsTwpisz :

c:\>tEsT
tEsT

Jeśli wpiszesz "test"wpisz , wyjście %0 będzie miało cudzysłowy (ponieważ je wpisałeś), ale bez rozszerzenia:

c:\>"test"
"test"

Na koniec, jeśli wpiszesz "C:\test.bat", wynik będzie dokładnie taki, jak gdybyś dwukrotnie kliknął it:

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

Zauważ, że nie są to wszystkie możliwe wartości %0 może być, ponieważ można wywołać skrypt z innych folderów:

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

Wszystkie powyższe przykłady będą miały również wpływ na %~0, ponieważ wyjście %~0 jest po prostu wyjściem %0 minus cudzysłowy (jeśli istnieją).

 3
Author: Pacerier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-18 04:00:19

Ten kod wyjaśnia użycie znaku ~ tilda, co było dla mnie najbardziej mylące. Kiedy to zrozumiałem, to znacznie ułatwia to zrozumienie:

@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
 2
Author: djangofan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 16:13:50

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 desktop, to "%~dp0" wyświetli katalog desktop. jeśli chcesz, aby wyświetlał bieżący katalog z bieżącą nazwą pliku, możesz wpisać "%~dp0% ~ n0% ~ x0".

 0
Author: zask,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 18:00:51