Batch file 批处理循环的正确分隔符

Batch file 批处理循环的正确分隔符,batch-file,cmd,Batch File,Cmd,此代码: @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

此代码:

@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=\n" %%d IN (list.txt) DO md "%%d\!c!"
 )
基于列表文件创建文件夹,并基于用户输入向每个文件夹添加子目录。子目录创建正确,但名称列表在分隔符周围有一些古怪的行为。下面是一个假设列表:

7 Jonathon, Hasselhoff B
7 Dean, Granger P
7 Dean, Jimmy C
7 Norris, Chuck J
7 Chan, Jackie S
通过上面的代码运行此列表将生成以下文件夹名称:

7 Jo
7 Dea
7 Norris, Chuck J
7 Cha

如果我更改代码以便
delims=“
则此操作按预期进行。有人能解释原因吗?

我建议此任务使用以下批处理文件:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

:GetFolderCount
set "FolderCount="
set /P "FolderCount=How many subdirectories would you like to add in each folder? "
rem Has the user entered anything at all?
if not defined FolderCount goto GetFolderCount
rem Has the user entered a string not consisting only of digits?
for /F delims^=0123456789^ eol^= %%I in ("!FolderCount!") do goto GetFolderCount
rem Has the user entered a positive integer too large for Windows command
rem processor or being interpreted octal by cmd.exe because of leading zeros?
set /A TempCount=FolderCount
if not %TempCount% == %FolderCount% goto GetFolderCount
set "TempCount="

if not %FolderCount% == 0 (
    for /L %%I in (1,1,%FolderCount%) do (
        set "FolderName="
        set /P "FolderName=What is the name of subdirectory %%I? "
        if defined FolderName for /F "eol=| delims=" %%J in (list.txt) do md "%%~J\!FolderName!"
    )
)

endlocal
批处理文件不相信用户输入的总是正确的正整数。因此批处理文件首先删除环境变量
FolderCount

接下来,它会提示批处理文件用户输入子目录的数量。
FolderCount
如果用户只是点击RETURN或ENTER导致再次提示用户,则仍然没有定义。在提示用户使用默认值之前,也可以使用类似
1
的值定义
FolderCount
用户只需按回车键或回车键即可使用

用户可以随意有意或错误地输入任何字符串,而不仅仅是批处理文件所期望的正整数。因此,接下来将验证输入的字符串是否仅由数字组成

FOR在使用选项时忽略空字符串(不再可能)和以
开头的字符串。输入的以分号开头的字符串应解释为错误输入,这就是将默认的
eol=;
重新定义为仅定义
eol=
的原因,以定义行尾字符,从而不忽略与第一个字符无关的字符串

FOR将字符串拆分为子字符串(标记)默认情况下,使用普通空格和水平制表符作为子字符串的分隔符,并仅将第一个子字符串指定给指定的循环变量
I
。通过使用
delims=0123456789
将所有数字指定为分隔符来修改此字符串拆分行为。for循环不执行逗号dGOTO如果用户输入的字符串仅由数字组成,则在这种情况下,无法将任何内容分配给循环变量
I
。但是,如果用户输入的字符串中有任何其他字符,则GOTO命令由FOR执行,在这种情况下,循环变量分配了某些内容

替代的非双引号方法用于定义分隔符列表和非行尾字符,这要求使用字符插入符号对两个选项之间的两个等号和空格字符进行转义
^
,以便按照F的要求将整个选项字符串解释为一个参数字符串或语法

通过此检查后,用户输入的字符串肯定只包含数字

但它可能有前导零,导致解释数字八进制或数字太大,如
439870123842
。因此,用户输入的字符串被分配给另一个环境变量,使用算术表达式,从而将用户输入的字符串转换为值范围为32位有符号整数e
0
2147483647
在这种情况下,因为开始时的
-
已不再可能。生成的整数下一步将转换回分配给环境变量
TempCount
的字符串。因此,如果分配给
TempCount
的字符串与分配给
FolderCount>的字符串不相等
,用户输入的值不满足正32位十进制整数值的要求

仍然可能的是,用户为子目录的数量输入了
0
,在这种情况下,下一个块根本不执行,因为根据用户的输入没有什么可做的

在循环中提示用户输入文件夹名称之前,环境变量
FolderName
始终会被删除。因此,用户必须始终输入文件夹名称,否则不会执行任何操作。如果以前为子目录输入的名称需要再次使用,则用户可以使用key UP键一次或多次

子目录按预期在用户输入的非空字符串上创建,该字符串对于当前目录中文件
list.txt
中定义的每个子目录中的文件夹名称有效

使用选项
/F
读取文件
list.txt
中的行的FOR命令被修改为选项
eol=|
delims=
,这一次在双引号参数字符串中指定,不忽略以分号开头的行,也不将每行拆分为子字符串,因为用于指定空分隔符列表。垂直条用于替换
,因为文件夹名称不能包含垂直条,而文件夹名称的开头可以使用分号

因此,您使用
delims=\n
定义了拆分反斜杠或字母
n
上的行,而以
delims=
结尾的可选参数字符串定义了一个空的分隔符列表,导致完全关闭字符串/行拆分行为,并始终将其分配给指定的循环变量
J
从列表文件中读取的整个非空行(如果不是以垂直条开始)

注意:
list.txt
中包含一个或多个感叹号的目录名未正确处理,因为启用了延迟环境变量扩展。但在这里似乎没有问题

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面