Значение %%~dpa?

Мне дано поддерживать некоторые пакетные файлы, и я постоянно вижу эту строку в начале каждого пакетного файла.

FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"

Кто-нибудь знает, что делает первая строка? Что такое %%~dpa? Что такое %0? Что такое usebackq?


person Santhosh    schedule 08.09.2010    source источник


Ответы (2)


%~dpa дает вам диск и путь к файлу, на который указывает %a (конечно, с использованием двойного %, поскольку вы работаете в сценарии). Из нижней части справки for /? в cmd.exe:

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

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

The modifiers can be combined to get compound results:

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

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.

%0 — это имя запущенного пакетного файла, а usebackq и tokens= — параметры команды for. tokens= можно использовать для назначения слов определенным переменным, и в этом случае использование * помещает все в %%a.

usebackq изменяет способ обработки кавычек вокруг аргумента %0. Без него одинарные кавычки запускали бы команду и использовали вывод этой команды, а не значение %0.

Более подробную информацию можно найти, запустив вышеупомянутый файл for /?.

Этот трюк PATH, кстати, является отличным способом чтобы найти исполняемые файлы на вашем пути.

person paxdiablo    schedule 08.09.2010
comment
И %0 будет текущим именем пакетного файла? - person Santhosh; 08.09.2010

@Santhosh: %0 будет как вызывался текущий пакетный файл . Это может быть любая из следующих форм: abc.bat, abc (без суффикса .bat), ..\..\abc.bat, d:\path\to\abc.bat, "e:\path with spaces\to\abc.bat" и, возможно, некоторые другие.

Теперь использовать %0 для дальнейшей обработки ни в коем случае не получится, так как его там нет в каноническом виде. Вы будете использовать

  • %~0 : убрать кавычки, которые могут появляться вокруг %0 (если есть);
  • %~n0 : просто использовать имя %0 без суффикса;
  • %~nx0 : использовать имя+суффикс %0;
  • %~pnx0 : использовать путь+имя+суффикс %0 (без буквы диска);
  • %~dpnx0: использовать букву диска+путь+имя+суффикс %0.

То же самое можно использовать для очистки %1 (первый аргумент %0), %2 и т. д., если эти аргументы являются файлами или каталогами.

person Kurt Pfeifle    schedule 09.09.2010