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

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

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

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

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

7 ответов


вызов

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 мочь заменяются другими допустимыми значениями. Синтаксис %~ завершается допустимым Для имени переменной. Выбирая верхний регистр имена переменных, такие как %I, делают его больше читаемый и избегает путаницы с модификаторы, которых нет чувствительный.

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


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

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

к %~dp0 переменной

переменная %~dp0 (это ноль) при ссылке в Windows пакетный файл будет расширен до drive письмо и path этой партии файл.

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

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

Пример: Предположим, у вас есть каталог на C: называется bat_files, и в этом каталоге находится файл с именем example.летучая мышь. В этом случае, %~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 - 1:12 ВЕЧЕРА 7/6/2018

%1-%9 см. args командной строки. Если это так!--31-->не допустимые значения: путь, %~dp1 - %~dp9 все будут расширяться до того же значения, что и %~dp0. Но если они ... --31-- > are допустимые значения пути, они будут расширяться, чтобы собственные водителя/пути.

например: (партия.летучая мышь)

@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:3\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:3\
~dp2= e:\abc\

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

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


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

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

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


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

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

C:\script\test.летучая мышь!--2-->

содержание:

@echo off
echo %~dp0

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

\C:\script


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


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

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