Что означает% ~ dp0 и как это работает? - PullRequest
922 голосов
/ 17 февраля 2011

Я нахожу %~dp0 очень полезным, и я часто использую его, чтобы сделать мои командные файлы более переносимыми.

Но сам ярлык мне кажется очень загадочным ... Что делает ~?dp означает диск и путь?0 ссылается на %0, путь к пакетному файлу, который включает имя файла?

Или это просто странная метка?

Я также хотел бы знатьесли это документированная функция или что-то склонное к устареванию.

Ответы [ 7 ]

737 голосов
/ 17 февраля 2011

Вызов

for /?

в командной строке дает справку об этом синтаксисе (который также может использоваться вне FOR, здесь же можно найти помощь).

Кроме того, улучшена замена ссылок на переменные FOR.Теперь вы можете использовать следующий необязательный синтаксис:

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

Модификаторы можно комбинировать для получения составных результатов:

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

В приведенных выше примерах% I и PATH можно заменить другимидействительные значения.Синтаксис% ~ завершается допустимым именем переменной FOR.Выбор имен переменных в верхнем регистре, таких как% I, делает его более читаемым и позволяет избежать путаницы с модификаторами, которые не чувствительны к регистру.

Существуют разные буквы, такие как f для "полного пути"", d для буквы диска, p для пути, и они могут быть объединены.%~ - начало каждой из этих последовательностей, а число I обозначает, что оно работает с параметром %I (где %0 - полное имя пакетного файла, как вы и предполагали).

301 голосов
/ 24 апреля 2012

(Во-первых, я хотел бы рекомендовать этот полезный справочный сайт для партии: http://ss64.com/nt/)

Тогда просто еще одно полезное объяснение: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

Переменная% ~ dp0

Переменная% ~ dp0 (это ноль) при обращении в Windows пакетный файл расширится до букв d rive и p ath этой партии файл.

Переменные% 0-% 9 относятся к параметрам командной строки пакета файл. % 1-% 9 ссылается на аргументы командной строки после имени пакетного файла. % 0 относится к самому пакетному файлу.

Если после символа процента (%) следует символ тильды (~), Вы можете вставить модификатор (и) перед номером параметра, чтобы изменить способ расширения переменной. Модификатор d распространяется на диск буква и модификатор p расширяется до пути к параметру.

Пример: допустим, у вас есть каталог на C: с именем bat_files, и в этом каталоге находится файл с именем example.bat. В этом случае% ~ dp0 (объединяя модификаторы d и p) расширится до C: \ bat_files.

Проверьте эту статью Microsoft для полного объяснения.

Также, ознакомьтесь с этой веткой форума .

И более четкая ссылка из здесь :

  • %CmdCmdLine% вернет всю командную строку, переданную в CMD.EXE

  • %* вернет остаток командной строки, начиная с первого аргумента командной строки (в Windows NT 4% * также включает все начальные пробелы)

  • %~dn вернет букву диска% n (n может варьироваться от 0 до 9), если% n является допустимым путем или именем файла (без UNC)

  • %~pn вернет каталог% n, если% n является допустимым путем или именем файла (без UNC)

  • %~nn вернет имя файла только% n, если% n является допустимым именем файла

  • %~xn вернет расширение файла только% n, если% n является допустимым именем файла

  • %~fn вернет полный путь% n, если% n является допустимым именем файла или каталога

ДОБАВИТЬ 1

Только что нашел хорошую справку для таинственного оператора тильды ~.

Строка %~ называется оператором процентов тильды . Вы можете найти его в таких ситуациях, как: %~0.

Строка :~ называется оператором двоеточия . Вы можете найти его как %SOME_VAR:~0,-1%.

ADD 2 - 13:12 7/6 / 2018

%1-%9 см. Аргументы командной строки. Если они являются , а не действительными значениями пути, %~dp1 - %~dp9 будет расширяться до того же значения, что и %~dp0. Но если они являются действительными значениями пути, они расширятся до их собственного значения драйвера / пути.

Например: (Batch.bat)

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

Прогон 1:

D:\Workbench>batch arg1 arg2

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

Прогон 2:

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

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
143 голосов
/ 17 февраля 2011

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

Переменная %0 в пакетном скрипте установлена ​​на имя исполняемого пакетного файла.Специальный синтаксис ~dp между % и 0 в основном говорит о расширении переменной %0, чтобы показать букву и путь к диску, который дает вам текущий каталог, содержащий пакетный файл!

38 голосов
/ 25 ноября 2014

% ~ dp0 расширяется до текущего пути к каталогу запущенного пакетного файла.

Чтобы получить четкое представление, давайте создадим командный файл в каталоге.

C: \ скрипт \ test.bat

с содержанием:

@echo off
echo %~dp0

Когда вы запустите его из командной строки, вы увидите следующий результат:

C: \ скрипт \

33 голосов
/ 14 сентября 2012

Еще один совет, который может очень помочь, заключается в том, что для установки текущего каталога на другой диск сначала нужно будет использовать %~d0, затем cd %~dp0 . Это изменит каталог на диск с командным файлом, а затем перейдет в его папку.

В качестве альтернативы для #oneLinerLovers, как указал @Omni в комментариях cd /d %~dp0, изменится и диск, и каталог:)

Надеюсь, это кому-нибудь поможет.

21 голосов
/ 25 сентября 2012

Отличный пример из переносного панциря 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%

не уверен, что отрицательный 1 сам там делает, но это доставляет удовольствие

12 голосов
/ 21 июня 2012

Хороший пример - вот тривиальный

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

, в котором перечислены только расширения каждого файла в текущей папке

для более полезных комбинаций переменных (также перечисленных в предыдущем ответе)) из приглашения CMD выполните: HELP FOR, который содержит этот фрагмент

Модификаторы могут быть объединены для получения составных результатов:

%~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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...