我已经批量处理了这个,我正试图让父目录坚持下去。
@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
之后没有翻译。
答案 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!
)