Ответ 1
2015-03-30: Отредактировано - добавлена отсутствующая информация
Чтобы извлечь текущий каталог, вы можете использовать динамическую переменную %cd%
, которая содержит текущий активный каталог
set "curpath=%cd%"
Это генерирует значение с завершающим обратным слэшем для корневого каталога и без обратной косой черты для остальных каталогов. Вы можете принудительно и заканчивать обратную косую черту для любого каталога с помощью
for %%a in ("%cd%\") do set "curpath=%%~fa"
Или вы можете использовать другую динамическую переменную: %__CD__%
, которая вернет текущий активный каталог с завершающим обратным слэшем.
Кроме того, помните, что переменная %cd%
может иметь прямое значение. В этом случае возвращаемое значение не будет текущим каталогом, а назначенным значением. Вы можете предотвратить это со ссылкой на текущий каталог
for %%a in (".\") do set "curpath=%%~fa"
До Windows XP переменная %__CD__%
имеет такое же поведение. Он может быть перезаписан пользователем, но, по крайней мере, из окон 7 (я не могу проверить его на Vista), любое изменение в %__CD__%
разрешено, но когда переменная читается, измененное значение игнорируется, а правильный ток извлекается активный каталог (примечание: измененное значение все еще отображается с помощью команды set
).
НО все предыдущие коды вернут текущий активный каталог, а не каталог, в котором хранится пакетный файл.
set "curpath=%~dp0"
Он вернет каталог, в котором хранится командный файл, с окончанием обратного слэша.
НО это произойдет, если в пакетном файле была использована команда shift
shift
echo %~dp0
По мере смещения аргументов командного файла ссылка %0
на текущий пакетный файл теряется.
Чтобы предотвратить это, вы можете получить ссылку на пакетный файл перед любым переключением или изменить синтаксис на shift /1
, чтобы гарантировать, что операция переключения начнется с первого аргумента, не затрагивая ссылку на пакетный файл. Если вы не можете использовать какие-либо из этих параметров, вы можете получить ссылку на текущий пакетный файл при вызове подпрограммы
@echo off
setlocal enableextensions
rem Destroy batch file reference
shift
echo batch folder is "%~dp0"
rem Call the subroutine to get the batch folder
call :getBatchFolder batchFolder
echo batch folder is "%batchFolder%"
exit /b
:getBatchFolder returnVar
set "%~1=%~dp0" & exit /b
Этот подход также может потребоваться, если при вызове имя командного файла указывается и полная ссылка не используется (читайте здесь).