Командная строка .cmd/.bat скрипт, как получить каталог запущенного скрипта
-
02-07-2019 - |
Вопрос
Как вы можете получить каталог скрипта, который был запущен, и использовать его в файле .cmd?
Решение
У Рэймонда Чена есть несколько идей:
https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573
Цитируется здесь полностью, поскольку архивы MSDN, как правило, несколько ненадежны:
Самый простой способ - использовать
%CD%
псевдопеременная.Он расширяется до текущего рабочего каталога .
set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
(Конечно, директорию сохранения/восстановления может более легко сделано с
pushd
/popd
, но дело здесь не в этом.)Тот Самый
%CD%
трюк удобен даже из командной строки.Например, я часто нахожусь в каталоге, где есть файл, с которым я хочу поработать, но...о, мне нужно выполнить chdir в какой-нибудь другой каталог, чтобы выполнить эту операцию.
set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args
(Мне нравится использовать
%_%
как моя переменная среды scratch.)Тип
SET /?
чтобы просмотреть другие псевдопеременные, предоставляемые командой processor.
Также стоит отсканировать комментарии в статье, например, этот (через WayBack Machine, поскольку комментарии из старых статей исчезли).:
http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741
Это распространяется на использование %~dp0:
Если вы хотите знать, где находится пакетный файл:
%~dp0
%0
это имя пакетного файла.~dp
указывает диск и путь к указанному аргументу.
Другие советы
Это эквивалентно пути к скрипту:
%~dp0
При этом используется синтаксис расширения пакетного параметра.Параметром 0 всегда является сам скрипт.
Если ваш скрипт хранится по адресу C:\example\script.bat
, тогда %~dp0
оценивает до C:\example\
.
ss64.com содержит дополнительную информацию о синтаксисе расширения параметра.Вот соответствующий отрывок:
Вы можете получить значение любого параметра, используя %, за которым следует его числовая позиция в командной строке.
[...]
Когда параметр используется для указания имени файла, может быть применен следующий расширенный синтаксис:
[...]
%~d1 Разверните %1 только до буквы диска - C:
[...]
%~p1 Расширить %1 только до Пути, например\utils\ это включает в себя завершающий символ \, который некоторыми командами может интерпретироваться как escape-символ.
[...]
Приведенные выше модификаторы могут быть объединены:
%~dp1 Разверните %1 только до буквы диска и пути к нему
[...]
Вы можете получить путь к самому пакетному скрипту с помощью %0, к нему могут быть применены расширения параметров, поэтому %~ dp0 вернет диск и путь к пакетному скрипту, напримерW:\scripts\
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d
pushd %curdir%