найти путь к текущей папке-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 

(эхо это, чтобы подтвердить, что этот код работает нормально)