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

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

Ответ 1

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

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

Цитируется здесь полностью, потому что архивы 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 /?, чтобы увидеть другие псевдопеременные, предоставленные командой процессор.

Также комментарии в этой статье заслуживают внимания, например:

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

Это относится к использованию% ~ dp0:

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

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

Ответ 2

Это эквивалентно пути script:

%~dp0

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

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

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

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

[...]

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

[...]

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

[...]

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

[...]

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

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

[...]

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

Ответ 3

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

pushd %curdir%

Источник