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

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

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

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

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

Ответ 1

Вызов

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

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

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

Ответ 2

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

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

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

Переменная% ~ dp0 (thats zero), когда она ссылается в пакетном файле Windows, будет расширяться до буквы d и 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.

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

ДОБАВИТЬ 2 - 13:12 7/6/2018

%1-%9 относятся к командной строке args. Если они не являются допустимыми значениями пути, то %~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\

Ответ 3

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

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

Ответ 4

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

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

C:\script\test.bat

с содержимым:

@echo off
echo %~dp0

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

C:\script\

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Пример будет приятным - здесь тривиальный

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

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

для более полезных комбинаций переменных (также перечисленных в предыдущем ответе) из приглашения 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