首页 > 解决方案 > 将批处理变量正确传递到嵌套循环 - 变量的延迟扩展

问题描述

我正在尝试制作一个脚本,该脚本从 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

但子目录不显示。建议?

请注意,我真的不知道为什么第一个工作代码需要这种特殊的 % 符号顺序,但这是我让它工作的唯一方法。

标签: windowsbatch-filecmd

解决方案


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在命令行上启用,而不是在批处理中启用。

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


推荐阅读