найти путь к текущей папке-cmd
Я использую этот скрипт, чтобы узнать текущую папку с ее .bat-файла:
for /f %%i in ("%0") do set curpath=%%~dpi
echo %curpath%
он работает неправильно, если путь содержит пробелы(D:ScriptsAll Скрипты - > извлекает только D:Scripts, если я помещаю в папку, путь которой не имеет пробелов, он получает полный путь). Как я могу это исправить?
3 ответов
2015-03-30: редактировать - добавлена недостающая информация
для получения текущего каталога вы можете использовать dynamic %cd%
переменная, которая содержит текущий active directory
set "curpath=%cd%"
это создает значение с конечной обратной косой чертой для корневого каталога и без обратной косой черты для остальных каталогов. Вы можете принудительно и заканчивая обратную косую черту для любого каталога с
for %%a in ("%cd%\") do set "curpath=%%~fa"
или вы можете использовать другую динамику переменная:%__CD__%
это вернет текущий active directory с конечной обратной косой чертой.
кроме того, помните о %cd%
переменная может иметь значение напрямую назначается. В этом случае возвращаемое значение будет не текущим каталогом, а назначенным значением. Вы можете предотвратить это со ссылкой на текущий каталог
for %%a in (".\") do set "curpath=%%~fa"
до windows XP,%__CD__%
переменная имеет такое же поведение. Он может быть перезаписан пользователем, но, по крайней мере, из windows 7 (i не могу проверить его на Vista), любые изменения в %__CD__%
разрешено, но при чтении переменной измененное значение игнорируется и извлекается правильный текущий active directory (Примечание: измененное значение по-прежнему отображается с помощью set
command).
но все предыдущие коды вернут текущий active directory, а не каталог, в котором хранится пакетный файл.
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
этот подход также может быть необходим, если при вызове имя пакетного файла цитируется и полная ссылка не используется (read здесь).
for /f "delims=" %%i in ("%0") do set "curpath=%%~dpi"
echo "%curpath%"
или
echo "%cd%"
двойные кавычки, если путь содержит каких-либо &
символы.
Используйте Этот Код
@echo off
:: Get the current directory
for /f "tokens=* delims=/" %%A in ('cd') do set CURRENT_DIR=%%A
echo CURRENT_DIR%%A
(эхо это, чтобы подтвердить, что этот код работает нормально)