我有一个FOR / F语句,我希望它枚举命令解析的delim。例如:
FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO (
some command to enumerate delims
)
:OUT
我希望它能够说明该句中的每个分隔项目。在这种情况下,它将输出6
IF %%A == [] SET enum=0 && GOTO:OUT
IF %%B == [] SET enum=1 && GOTO:OUT
等
答案 0 :(得分:3)
没有办法直接枚举FOR / F“delims = ...”命令中的项目。通常的做法是通过循环计算一个项目,从句子中删除它并重复计算项目。
但是,根据特定的分隔符和句子中的其余字符,您可以使用FOR命令(没有/ F选项)来重复其代码,每个项目由标准批量分隔符分隔,即逗号,分号和等号,除了空格。在您的特定示例中:
SET ENUM=0
FOR %%A IN (This,is,a,comma,delimited,sentence) DO SET /A ENUM+=1
直接计算以逗号分隔的项目数。如果分隔符是逗号,分号或等号以外的字符,则可能的解决方案是三步法:
1- Replace spaces, comma, semicolon and equal-sign for another know character(s).
2- Replace the delimiter for any Batch standard delimiter (space, comma, etc).
3- Use a simple FOR to directly enumerate the items.
答案 1 :(得分:3)
有一种方法可以直接枚举FOR / F“delims = ...”命令中的项目 您只需要在字符串中插入一些换行符。
setlocal EnableDelayedExpansion
set LF=^
rem ** Two empty lines are required
set count=0
FOR /F "tokens=* delims=" %%a in ("item1!LF!item2!LF!item3") DO (
set /a count+=1
echo !count!: "%%a"
)
echo(
set "CSV=This,is,a,comma,delimited,sentence"
echo Or with comma separeted text: !CSV!
for %%L in ("!LF!") do set "CSV=!CSV:,=%%~L!"
set count=0
FOR /F "tokens=* delims=" %%a in ("!CSV!") DO (
set /a count+=1
echo !count!: "%%a"
)
答案 2 :(得分:2)
Aacini建议使用简单的FOR代替FOR / F是一个很好的解决方案,除非该字符串可能包含通配符*
或?
。 ?
字符可以通过搜索和替换来保护,但是没有有效的方法可以批量替换*
。
如果遇到通配符问题,则可以在循环中恢复使用FOR / F来一次解析一个单词。大多数人使用GOTO来完成循环,因为你无法知道你会找到多少单词。但GOTO相对较慢。通过使用具有任意大量项目的外部FOR循环(不是FOR / L),可以显着提高性能。在没有更多单词的情况下,您可以使用GOTO退出循环。如果循环没有耗尽,可以使用GOTO重新启动循环。一个包含100个项目的外部循环每100个已解析的单词只能执行1个GOTO。
@echo off
setlocal enableDelayedExpansion
set "str=This,is,a,comma,delimited,sentence"
set "L10=1 2 3 4 5 6 7 8 9 0"
:loop - The outer FOR loop can handle 100 words before a single GOTO is needed
for %%. in (%L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10%) do (
for /f "tokens=1* delims=," %%A in ("!str!") do (
echo %%A
if "%%B" == "" goto :break
set "str=%%B"
)
)
goto :loop
:break
与所有FOR循环一样,如果在扩展%% A变量时启用了延迟扩展,则必须担心!
和^
的损坏。
FOR / L不应该用于外部循环,因为FOR / L总是完成对所有迭代的计数,即使你在体内使用GOTO也是如此。