Что означает% ~ dp0 и как это работает?

1024

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

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

Или это просто странный ярлык?

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

Себастьян Гриньоли
источник
13
Возможный дубликат Что означает% ~ d0 в командном файле Windows?
Хелен
2
Вы правы, Хеллен. Этот вопрос не появился, когда я искал% ~ dp0. Возможно, потому что в заголовке есть% ~ d0 вместо% ~ dp0.
Себастьян Гриньоли
9
SymbolHound отлично подходит для поиска не буквенно-цифровых символов. Например, поиск%~dp0 . Обычно я нахожу, что лучшие хиты относятся к контенту на SO.
DavidRR
SymbolHound не работает для меня с поиском symbolhound.com/?q=%25~dp0 . Однако это сработало: google.com/search?q=%25~dp0 - просто скажи ...
Кристофер
1
SymbolHound 2019: не работает, и uMatrix указывает, что он подключается к сторонним сайтам, таким как blockchain.info и paypalobjects.com.
Нильс Линдеманн

Ответы:

811

призвание

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полное имя пакетного файла, как вы и предполагали).

schnaader
источник
2
Я не знаю ни о ком другом, но я получаю: «Следующее использование оператора пути в подстановке пакетных параметров недопустимо. Для допустимых форматов введите CALL /? Или FOR / ?. Синтаксис команды неверен». при использовании I. Я должен использовать 0вместо I. Я не знаю, пропустил ли я что-то или что-то еще, но просто говорю людям.
Мифофешелон
71
@BenHooper, Iявляется заполнителем для индекса переменной. 0= вызывающий файл, 1= аргумент № 1, 2= аргумент № 2 и т. д ...
Крис
9
Этот ответ хорош. И исчерпывающий. Для большей краткости мне нравится ответ на этот почти дублирующий вопрос: stackoverflow.com/questions/112055/…
Фрэнк Нок
1
Этот ответ немного сбивает с толку, потому что эти замены могут использоваться вне FOR.
Дэвид
348

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

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

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

% ~ Dp0 (это ноль) переменной при ссылке в пакетном файле Windows , будет расширяться в г омывается рекой и буквой р АТН этого пакетного файла.

Переменные% 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%.

ДОБАВИТЬ 2 - 13:12 7/7/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\
smwikipedia
источник
Также любопытно узнать об этой концепции и найти здесь хорошее уточнение. Спасибо, Миндж. ^ _ ^
Евгений
1
для меня это расширяется до c: \ bat_files \ (с разделителем конечного пути)
santa
Ссылки на статью Microsoft и
ветку
151

Переменная %0в пакетном скрипте установлена ​​на имя исполняемого пакетного файла.

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

Помощь = Ссылка

Энди Уайт
источник
@ Andy, есть ли способ проверить %0напрямую в cmd без сохранения файла .bat на локальный жесткий диск?
Пейсер
Ссылка не работает, и я не могу найти правильную ссылку. Ожидание редактирования по-прежнему имеет неработающую ссылку.
George_E
45

% ~ dp0 раскрывает текущий путь к каталогу запущенного пакетного файла.

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

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

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

@echo off
echo %~dp0

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

C: \ скрипт \

значение NULL
источник
41

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

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

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

Марвин Тобеджане
источник
23
cdимеет встроенный параметр, который будет переключать как диск, так и папку:cd /d %~dp0
OmnipotentEntity
2
Вы правы, и /dаргумент полезен, но он заслуживает публикации в качестве альтернативного ответа кандидата, а не комментария к этому. Спасибо, что указали на это, хотя, я не знал об этом :)
Марвин Тобеджейн
4
Вы также можете использовать '' pushd% ~ dp0 '' для переключения диска и папки
fmuecke
25

Отличный пример из переносной оболочки 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 делает там сам, но это работает удовольствие!

HansBKK
источник
11
+1 очень полезно. Оператор if проверяет наличие обратной косой черты и, при необходимости, удаляет обратную косую черту. Отрицательный 1 в условии извлекает последний символ, а выражение в операторе set принимает строку пути минус последний символ (который является обратной косой чертой).
Мэтт
1
отрицательный 1 минус последний символ. Прочитать переменную подстроку
phuclv
12

Пример был бы хорош - вот тривиальный

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
админ
источник
я получил "~ xI было неожиданно в это время." попробовать пример - это потому, что я использую Win 7?
Chapter3
Это хорошая информация, но она не касается оригинального сообщения.
Де Шан Креститель