1 (изменено: Rumata, 2014-09-05 00:51:36)

Тема: CMD/BAT: %CD% не всегда верно показывает текущий путь

Выдержка из описания команды set /?:

%CD% - expands to the current directory string.

То есть, переменная должна указывать на текущий каталог. Но это не всегда верно. Например, если вы запустили некоторый скрипт из другого каталога и выполняете переход в другой каталог в цикле или подпроцессе (как правильно назвать блок команд в круглых скобках?) переменная %CD% будет указывать на исходный каталог, находясь в котором вы вызвали скрипт.

Пример
создайте каталог C:\tmp\test1\test2
создайте файл скрипта C:\tmp\test1.bat (см. ниже)
в консоли перейдите в любой другой каталог и запустите файл


@echo off

setlocal

echo:==== OK====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd

(
    echo:==== FAIL ====
    pushd "%~dpn0\test2"
    echo:%CD%
    cd
    popd
    echo:%CD%
    cd
)

C:\Windows>c:\tmp\test1.bat
==== OK ====
c:\tmp\test1\test2
c:\tmp\test1\test2
C:\Windows
C:\Windows
==== FAIL ====
C:\Windows
c:\tmp\test1\test2
C:\Windows
C:\Windows

Предлааемое решение

Команда cd возвращает правильное значение для текущего пути. Казалось бы в чем проблема - используй ее? Но ведь это очередная ошибка или недокументированная особенность и лишние телодвижения при разработке.

Закрыть проблему можно с помощью отдельной подпрограммы. Хотя это может показаться тоже не очень удобно.


@echo off

setlocal

call :cd

(
    call :cd
)
goto :EOF

:cd
echo:==== OK ====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd
goto :EOF
( 2 * b ) || ! ( 2 * b )

2

Re: CMD/BAT: %CD% не всегда верно показывает текущий путь

Rumata, а если так:

+ открыть спойлер
@echo off

setlocal

echo:==== OK====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd

(
    echo:==== FAIL ====
    pushd "%~dpn0\test2"
    call echo:%%CD%%
    cd
    popd
    call echo:%%CD%%
    cd
)

или так:

+ открыть спойлер
@echo off
setlocal enableextensions enabledelayedexpansion

echo:==== OK====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd

(
    echo:==== FAIL ====
    pushd "%~dpn0\test2"
    echo:!CD!
    cd
    popd
    echo:!CD!
    cd
)

endlocal
exit /b 0

?

3

Re: CMD/BAT: %CD% не всегда верно показывает текущий путь

Это нормальное явление. Всё, что в скобках, выполняется одним блоком. Переменная %CD% подставляется ОДИН раз, перед выполнением блока. Чаще всего, такая ситуация возникает в многострочном FOR, но там этим не удивишь, здесь же то же самое.

4

Re: CMD/BAT: %CD% не всегда верно показывает текущий путь

Таки да! Это же очевидно! Но почему-то споткнулся на этом.

( 2 * b ) || ! ( 2 * b )