Подтвердить что ты не робот

Найти путь текущей папки - cmd

Я использую этот script, чтобы узнать текущую папку с ее .bat файлом:

for /f %%i in ("%0") do set curpath=%%~dpi 
echo  %curpath% 

он работает неправильно, если путь содержит пробелы (D:\Scripts\All Scripts → извлекает только D:\Scripts \, если я помещаю в папку, путь которой не имеет пробелов, он извлекает полный путь). Как я могу это исправить?

4b9b3361

Ответ 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

Этот подход также может потребоваться, если при вызове имя командного файла указывается и полная ссылка не используется (читайте здесь).

Ответ 2

for /f "delims=" %%i in ("%0") do set "curpath=%%~dpi"
echo "%curpath%"

или

echo "%cd%"

Двойные кавычки необходимы, если путь содержит любые символы &.

Ответ 3

Использовать этот код

@echo off
:: Get the current directory

for /f "tokens=* delims=/" %%A in ('cd') do set CURRENT_DIR=%%A

echo CURRENT_DIR%%A 

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