Я на Windows 10 Enterprise x64. У меня есть следующая иерархия каталогов с BAT-файлом на самом внутреннем уровне:
C:\
dir\
my files\
run.bat
BAT-файл содержит следующие строки:
@pushd %~dp0
@echo %~dp0
@popd
(значение и использование %~dp0
объяснено в разделе справки for /?
и в этом ответ)
Если я запускаю BAT-файл из командной строки, текущим каталогом которой является C:\dir\my files
, я получаю очень разумный результат:
C:\dir\my files>run.bat
C:\dir\my files\
Но если я вызову его из родительского каталога C:\dir
, я получу:
C:\dir>"my files"\run.bat
C:\dir\my files\my files"\
А? Обратите внимание, что внутреннее имя каталога дублируется, и в конце есть несколько случайных символов "\
. Давайте попробуем это по-другому:
C:\dir>"my files\run.bat"
C:\dir\my files\my files\
Заблудшие символы исчезли, но имя каталога все еще дублируется. Чем это объясняется? Как я могу изменить BAT-файл так, чтобы он давал одинаковые выходные данные независимо от того, из какого каталога он был вызван?
Конечно, мой реальный сценарий более сложен, чем эта упрощенная версия. Значение %~dp0
объединяется с другими строками, присваивается переменным среды, передается в качестве аргумента другим сценариям и т.д.