【问题标题】:Is calling FOR with "tokens=*" or "delims=" functionally equivalent?用 "tokens=*" 或 "delims=" 调用 FOR 在功能上是等效的吗?
【发布时间】:2018-12-03 00:18:13
【问题描述】:

考虑以下两个循环:

for /f "tokens=*" %%a in ('dir /b %TEMP%') do (
   echo %%a
)

for /f "delims=" %%a in ('dir /b %TEMP%') do (
   echo %%a
)

如果我想要的结果是为变量%%a 提供正在评估的整行的内容,那么选项tokens=*delims= 在功能上是否等效?

在给定特定输入的情况下,我可能会在其中一个或另一个得到不同的输出?

我想知道这两个选项是否应该始终结合使用以保证覆盖所有潜在情况,或者如果同时指定这两个选项是多余的。

【问题讨论】:

  • 好吧,如果我们发布了 OP 没有要求的荒谬想法,您不妨学习 Python 或 C。
  • 命名一种没有任何怪癖的编程语言。
  • "delims=" 表示“整行”。 "tokens=*" 表示“所有标记”,但在这种情况下,第一个标记之前的空格不包含,因此当行有前导空格时,结果会有所不同。
  • @Bill_Stewart:如果您在批处理文件问题中发布未经请求的 PowerShell 评论(对 Batch 有一些批评),那么我有权对 PowerShell 发表反批评。我邀请您阅读 this article 末尾的 cmets,这些内容由 Batch-file 用户撰写,讲述他们在 PowerShell 上的体验,或者阅读由经验丰富的程序员撰写的有趣文章 What I Hate About PowerShell
  • 您可以阅读我对批处理文件问题here非请求 PS 解决方案的观点;例如:“是的:PowerShell 比批处理文件更多(在这里放任何你想要的好形容词),但这并不意味着它在所有情况下都是正确的选择,特别是当要解决的问题很简单时,比如这个”.

标签: windows batch-file for-loop cmd


【解决方案1】:

是的,tokens=*delims= 是不同的:

  • delims= 返回整行未编辑;
  • tokens=* 返回删除任何前导分隔符(默认为 SPACETAB)的行;
  • tokens=* delims= 的行为方式与 delims= 完全相同;

请注意,总是会跳过空行。以; 开头的行也会被忽略,因为该字符是默认的eol

如果指定了tokens=* 并且一行仅包含分隔符,则for /F 循环将迭代并且元变量返回一个空字符串。只要提供了任何令牌编号(如tokens=3tokens=1,3tokens=2-3tokens=2* 等),就会跳过仅包含分隔符的行。
但是,即使提供了tokens=*,包含一个或多个分隔符加上eol 字符和任意字符串的行也会被忽略。


为了证明我做了一些测试,使用以下文本文件sample.txt(注意第 2nd 行是空的,第 4th 行包含四个 SPACEs;点击此答案下方的edit 按钮并查看原始文本):

text_without_delimiters

text with delimiters

  text with leading and trailing delimiters  
; comment text
  ; comment text with leading delimiters
text plus ; comment text

这是我在控制台上所做的以及相应的返回字符串:

>>> for /F %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text"
"text"
"text"

>>> for /F "tokens=*" %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text with delimiters"
""
"text with leading and trailing delimiters  "
"text plus ; comment text"

>>> for /F "delims=" %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text with delimiters"
"    "
"  text with leading and trailing delimiters  "
"  ; comment text with leading delimiters"
"text plus ; comment text"

>>> for /F "tokens=* delims=" %I in (sample.txt) do @echo "%I"
"text_without_delimiters"
"text with delimiters"
"    "
"  text with leading and trailing delimiters  "
"  ; comment text with leading delimiters"
"text plus ; comment text"

>>> for /F "tokens=3" %I in (sample.txt) do @echo "%I"
"delimiters"
"leading"
";"

>>> for /F "tokens=1,3" %I in (sample.txt) do @echo "%I"    "%J"
"text_without_delimiters"    ""
"text"    "delimiters"
"text"    "leading"
"text"    ";"

>>> for /F "tokens=2-3" %I in (sample.txt) do @echo "%I"    "%J"
"with"    "delimiters"
"with"    "leading"
"plus"    ";"

>>> for /F "tokens=2*" %I in (sample.txt) do @echo "%I"    "%J"
"with"    "delimiters"
"with"    "leading and trailing delimiters  "
"plus"    "; comment text"

所以唯一真正奇怪和意外的输出是 "" 行,仅带有 tokens=* 选项。

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2010-11-17
    • 1970-01-01
    • 2010-11-19
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2016-01-20
    相关资源
    最近更新 更多