从例程中覆盖变量

时间:2012-07-28 09:24:13

标签: batch-file cmd

我已经批量处理了这个,我正试图让父目录坚持下去。

@echo off

SET CWD=

:process
if [%1] == [] goto end
SET MASTER_DIR="%~f1"

rem Change to say, E:\DVD_LIBRARY\Rips
cd /d %MASTER_DIR%
for /R %%D IN (\) DO (

    rem Temporarily change to the subdir, such as E:\DVD_LIBRARY\Rips\SIN_CITY\
    pushd %%D
    for /F "usebackq" %%Z in (`dir /b *.vob 2^>NUL`) DO (
        if exist %%~fZ (

            rem Get this parent directory to store the log file in (eventually)
            CALL :resolve "%%D\.." CWD

            rem Nada.
            echo: %CWD%
        )
    )
    popd
)
shift
goto process

:resolve
SET %2=%~f1
goto :EOF

:resolve例程中,我得到了我想要的价值。回到这个块:

if exist %%~fZ (
    CALL :resolve "%%D\.." CWD
    echo: %CWD%
)

我一无所获。

为什么这不是坚持或更好的方法?我已经搜索过谷歌并发现了这种技术,其他一些人喜欢这里,但我不知道为什么价值在CALL之后没有翻译。

1 个答案:

答案 0 :(得分:2)

问题不在于cwd变量未设置,而是您无法以您尝试的方式回显它。 那是因为它在解析IF块时会扩展。

但是你需要在CALL之后进行扩展。 您可以通过延迟扩展或CALL-Expansion来解决它

if exist %%~fZ (
    CALL :resolve "%%D\.." CWD
    call echo: %%CWD%%
)

setlocal EnableDelayedExpansion
if exist %%~fZ (
    CALL :resolve "%%D\.." CWD
    echo: !CWD!
)