将批处理变量正确传递到嵌套循环中 - 变量的延迟扩展



我正在尝试制作一个脚本,从list.txt(由回车符分隔的目录名称列表(创建一组文件夹,每个文件夹包含用户命名的特定数量的子目录。

此脚本正是这样做并正常工作的:

@echo off
setlocal enableextensions
set /P q="How many subdirectories would you like to add in each folder?[0/1/2/3]"
if /I "%q%" EQU "0" goto :somewhere0
if /I "%q%" EQU "1" goto :somewhere1
if /I "%q%" EQU "2" goto :somewhere2
if /I "%q%" EQU "3" goto :somewhere3
if errorlevel 1 goto :problem
:somewhere0
echo All done! Press any key to exit.
pause
exit
...(code cut for brevity)
:somewhere3
set /P c="What is the name of the first subdirectory?"
for /F "tokens=1 delims=," %%d IN (list.txt) DO md "%%c""%%d"
set /P c="What is the name of the second subdirectory?"
for /F "tokens=1 delims=," %%d IN (list.txt) DO md "%%c""%%d"
set /P c="What is the name of the third subdirectory?"
for /F "tokens=1 delims=," %%d IN (list.txt) DO if not exist %%d md "%%d" cd "%%d" md "%%c" cd ..
if errorlevel 1 goto :problem
goto :somewhere0
...

你明白了。但是,我尝试在循环中执行此操作,而不是对每个实例进行硬编码。我开发的代码如下所示:

@echo off
setlocal enableextensions
set "var=string"
set /P q="How many subdirectories would you like to add in each folder?"
for /l %%x in (1, 1, %q%) do (
set /P c="What is the name of subdirectory %%x?"
for /F "tokens=1 delims=," %%d IN (list.txt) DO md "%%d%c%"
)

尝试在循环中间回显变量 %%d 或 %c% 不会产生任何结果。陌生人,脚本实际上创建了顶级目录 - 即,此代码运行

for /F "tokens=1 delims=," %%d IN (list.txt) DO md "%%d

但是子目录不显示。建议?

请注意,老实说,我不知道为什么第一个工作代码需要这种特定的百分比符号顺序,但这是我让它工作的唯一方法。

enabledelayedexpansion就是你想要的。

@echo off
setlocal enableextensions enabledelayedexpansion
set "var=string"
set /P q="How many subdirectories would you like to add in each folder? "
for /l %%x in (1, 1, %q%) do (
set /P c="What is the name of subdirectory %%x? "
for /F "tokens=1 delims=," %%d IN (list.txt) DO md "%%d!c!"
)

cmd.exe如果你运行setlocal /?你会得到更多的帮助,但简而言之,enabledelayedexpansion启用延迟的环境变量扩展。这将导致批处理文件中的变量在执行时而不是在解析时展开。也可以在命令行上以CMD /V:ON启用,而不是在批处理中启用。

你基本上告诉命令处理器延迟变量的解析,直到它执行它们。%!替换,以显示要在扩展中使用哪些变量。

最新更新