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

Uważam, że %~dp0 jest bardzo 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 dp oznacza napęd i ścieżkę? czy 0 odnosi się do %0, ścieżki do pliku wsadowego zawierającego nazwę pliku?

Czy to tylko dziwna Etykieta?

Chciałbym też wiedzieć, czy jest to udokumentowana funkcja, czy coś, co może być przestarzałe.

Author: Andrew Swan, 2011-02-17

7 answers

Wywołanie

for /?

W wierszu poleceń podaje pomoc na temat tej składni(która może być również używana na zewnątrz, jest to tylko miejsce, gdzie można znaleźć pomoc).

Ponadto, zastąpienie dla Poprawiono odwołania do zmiennych. Możesz teraz użyć następujących opcji składnia:

%~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ć wyniki złożone:

%~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 mogą zastępuje się innymi ważnymi wartościami. Składnia % ~ jest zakończona poprawnym Dla nazwy zmiennej. Wybieranie górnej skrzynki nazwy zmiennych, takie jak %i sprawia, że bardziej czytelny i pozwala uniknąć pomyłek z modyfikatory, które nie są przypadkiem wrażliwa.

Istnieją różne litery, których możesz użyć, jak f dla "pełnej nazwy ścieżki", d dla litery napędu, p dla ścieżki, i można je łączyć. {[6] } jest początkiem każdej z tych sekwencji, a liczba I oznacza, że działa na parametrze %I (gdzie %0 jest pełna nazwa pliku wsadowego, tak jak zakładałeś).

 658
Author: schnaader,
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-04-17 15:53:30

(Po Pierwsze, chciałbym polecić tę użyteczną stronę referencyjną dla partii: http://ss64.com/nt/)

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

Zmienna %~DP0

Zmienna %~DP0 (czyli zero), gdy odwołuje się do niej w systemie Windows plik wsadowy rozwinie się do drive i p ath tej partii plik.

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

Jeśli zastosujesz znak procentowy ( % ) ze znakiem tyldy (~), możesz wstawić modyfikator(y) przed numerem parametru, aby zmienić sposób rozwinięcia zmiennej. Modyfikator d rozszerza się na napęd litera i modyfikator p rozszerza się na ścieżkę parametru.

Przykład: powiedzmy, że masz katalog na C: nazywa się bat_files, a w tym katalogu znajduje się plik o nazwie example.bat. W tym przypadku %~dp0 (łącząc modyfikatory d I p) rozszerzy się na C:\bat_files.

Sprawdź ten artykuł Microsoftu, aby uzyskać pełne wyjaśnienie.

Sprawdź również ten wątek na forum.

I bardziej jasne odniesienie z tutaj :

  • %CmdCmdLine% zwróci całą linię poleceń przekazaną do CMD.EXE

  • %* zwróci pozostałą część wiersza poleceń rozpoczynającą się od pierwszego argumentu wiersza poleceń (w systemie Windows NT 4 %* zawiera również wszystkie początkowe spacje)

  • %~dn zwróci literę dysku %n (n może wahać się od 0 do 9), Jeśli %n jest poprawną ścieżką lub nazwą pliku (bez UNC)

  • %~pn zwróci katalog %N, jeśli %n jest poprawną ścieżką lub nazwą pliku (bez UNC)

  • %~nn zwróci tylko nazwę pliku %N jeśli %n jest poprawną nazwą pliku

  • %~xn zwróci rozszerzenie pliku tylko O %N, jeśli %n jest poprawną nazwą pliku

  • %~fn zwróci w pełni kwalifikowaną ścieżkę %N, jeśli %n jest poprawną nazwą pliku lub katalogu

Dodaj 1

Właśnie znalazłem jakieś dobre odniesienie do tajemniczego ~ operator tyldy.

Łańcuch %~ nazywa się operatorem percent tilde . Można go znaleźć w takich sytuacjach jak: %~0.

Łańcuch :~ nazywa się operatorem dwukropek tyldy . Można go znaleźć jak %SOME_VAR:~0,-1%.

ADD 2-1:12 PM 7/6/2018

%1-%9 odnoszą się do args linii poleceń. Jeśli są , a nie poprawnymi wartościami ścieżki, %~dp1 - %~dp9 wszystkie rozszerzą się do tej samej wartości co %~dp0. Ale jeśli poprawnymi wartościami Ścieżki, zostaną one rozszerzone do ich własnej wartości driver/path.

Na przykład: (seriabat)

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

Run 1:

D:\Workbench>batch arg1 arg2

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

Bieg 2:

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

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
 252
Author: smwikipedia,
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-07-06 05:18:15

Http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

Zmienna %0 w skrypcie wsadowym jest ustawiana na nazwę wykonywanego pliku wsadowego. Specjalna składnia ~dp pomiędzy % i 0 zasadniczo mówi, aby rozwinąć zmienną %0, aby pokazać literę dysku i ścieżkę, co daje bieżący katalog zawierający plik wsadowy!

 138
Author: Andy White,
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
2011-02-17 21:48:55

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.

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

Mam nadzieję, że to komuś pomoże.
 32
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
2013-10-23 07:44:31

%~dp0 rozszerza do bieżącej ścieżki katalogu uruchomionego pliku wsadowego.

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

C:\script\test.bat

O treści:

@echo off
echo %~dp0

Gdy uruchomisz go z wiersza polecenia, zobaczysz taki wynik:

C:\script\

 31
Author: null,
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-11-25 08:44:28

Świetny przykład z przenośnego launchera powłoki 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 tam negatyw 1, ale działa smakowicie!

 21
Author: HansBKK,
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-25 18:39:47

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

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

Wyświetla tylko rozszerzenia KAŻDEGO pliku w bieżącym folderze

Aby uzyskać więcej użytecznych kombinacji zmiennych (również wymienionych w poprzedniej odpowiedzi) z wiersza polecenia CMD wykonaj: HELP FOR który zawiera ten fragment

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

%~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
 11
Author: admin,
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-09-12 10:25:01