it-swarm.com.ru

Командная строка .cmd / .bat script, как получить каталог запущенного скрипта

Как вы можете получить каталог сценария, который был запущен и использовать его в файле .cmd?

78
Brian R. Bondy

У Раймонда Чена есть несколько идей:

https://devblogs.Microsoft.com/oldnewthing/20050128-00/?p=3657

Цитируется здесь полностью, потому что архивы 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

(Мне нравится использовать %_% в качестве моей переменной окружения.)

Введите SET /?, чтобы увидеть другие псевдопеременные, предоставляемые процессором команд.

Также стоит отсканировать комментарии в статье, например, этот (через WayBack Machine, поскольку комментарии ушли из более старых статей):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

Это охватывает использование% ~ dp0:

Если вы хотите знать, где находится пакетный файл: %~dp0

%0 - это имя командного файла. ~dp дает вам диск и путь указанного аргумента.

57
Kev

Это эквивалентно пути сценария:

%~dp0

При этом используется синтаксис расширения пакетного параметра. Параметр 0 - это всегда сам скрипт.

Если ваш скрипт хранится в C:\example\script.bat, то %~dp0 оценивается как C:\example\.

ss64.com содержит больше информации о синтаксисе расширения параметра. Вот соответствующая выдержка:

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

[...]

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

[...]

% ~ d1 Развернуть% 1 только до буквы диска - C:

[...]

% ~ p1 Развернуть% 1 только до пути, например\utils\включает в себя завершающий символ \, который некоторые команды могут интерпретировать как escape-символ.

[...]

Модификаторы выше могут быть объединены:

% ~ dp1 Развернуть% 1 только до буквы диска и пути

[...]

Вы можете получить путь к самому пакетному сценарию с помощью% 0, к нему можно применить расширения параметров, так что% ~ dp0 вернет диск и путь к пакетному сценарию, например. W:\Scripts \

139
Landon
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d

pushd %curdir%

Источник

0
Alex. S.