For loop 枚举FOR/F语句的delims

For loop 枚举FOR/F语句的delims,for-loop,batch-file,windows-xp,enumerate,For Loop,Batch File,Windows Xp,Enumerate,我有一个FOR/F语句,我希望它枚举命令正在解析的delims。例如: FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO ( some command to enumerate delims ) :OUT SET ENUM=0 FOR %%A IN (This,is,a,comma,delimited,sentence) DO SET /A ENUM+=1 我想让它解释那个句子中每个分隔的项目。在这种

我有一个FOR/F语句,我希望它枚举命令正在解析的delims。例如:

FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO (
    some command to enumerate delims
)
:OUT
SET ENUM=0
FOR %%A IN (This,is,a,comma,delimited,sentence) DO SET /A ENUM+=1
我想让它解释那个句子中每个分隔的项目。在这种情况下,它将输出
6

编辑:我知道很长的路要走,要对每一个都进行检查。。但我试图避免这种方法:

IF %%A == [] SET enum=0 && GOTO:OUT
IF %%B == [] SET enum=1 && GOTO:OUT

等等。

在FOR/F“delims=…”命令中无法直接枚举项。通常的方法是通过一个循环来计数一个项目,从句子中删除它,并在有计数项目时重复

但是,根据特定的分隔符和句子中的其他字符,您可以使用FOR命令(带有no/F选项),该命令将重复其代码,每个项目由标准的批分隔符分隔,即逗号、分号和等号,以及空格。在您的特定示例中:

FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO (
    some command to enumerate delims
)
:OUT
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.

在FOR/F“delims=…”命令中无法直接枚举项。通常的方法是通过一个循环来计数一个项目,从句子中删除它,并在有计数项目时重复

但是,根据特定的分隔符和句子中的其他字符,您可以使用FOR命令(带有no/F选项),该命令将重复其代码,每个项目由标准的批分隔符分隔,即逗号、分号和等号,以及空格。在您的特定示例中:

FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO (
    some command to enumerate delims
)
:OUT
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.

Aacini建议使用简单的FOR而不是FOR/F是一个很好的解决方案,除非字符串可能包含通配符
*
字符可以通过搜索和替换进行保护,但没有有效的方法批量替换
*

如果遇到通配符问题,则可以在循环中使用FOR/F一次解析一个单词。大多数人使用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循环一样,您必须担心
的损坏
^


FOR/L不应用于外部循环,因为FOR/L始终完成所有迭代的计数,即使您在正文中使用GOTO。

Aacini建议使用简单的FOR而不是FOR/F是一个很好的解决方案,除非字符串可能包含通配符
*
字符可以通过搜索和替换进行保护,但没有有效的方法批量替换
*

如果遇到通配符问题,则可以在循环中使用FOR/F一次解析一个单词。大多数人使用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循环一样,您必须担心
的损坏
^


FOR/L不应用于外部循环,因为FOR/L始终完成所有迭代的计数,即使在正文中使用GOTO。

有一种方法可以直接枚举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"
)

有一种方法可以直接枚举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"
)

有趣的是,我从来不知道他能做这样的事。我一直认为循环的标准只用于迭代文件。最重要的是,它知道停止阅读逗号、分号和相等字符?有趣的是,我从来都不知道FOR可以做这样的事情。我一直认为循环的标准只用于迭代文件。最重要的是,它知道停止阅读逗号、分号和相等字符?哇,太棒了!然而,我仍然不明白为什么这个方法有效。我一直认为,
FOR/F%%x IN(“string”)
不是一个重复的命令,而是FOR的一种特殊形式,它只需在令牌中分隔一个字符串并执行一次命令。您的示例显示,在字符串中插入“delims=”和“LF”(“tokens=”不是必需的)后,FOR/F转换将在重复命令中再次执行!这是LF字符的特殊处理(不是“错误”);否则,为什么其他分隔符的处理方式不同?+1-我忘记了这个解决方案。这绝对是个好主意。@Aacini-这不是特殊处理。FOR/F在遇到LF时总是会启动一个新的迭代,而不管它从何处获取输入。@dbenham:这意味着上面的示例在没有“tokens=*delims=”option:
FOR/F%%a in(“item1!LF!item2!LF!item3”)DO…
的情况下也可以工作。处理字符串中的几行