Batch file 禁用eol,将delims设置为linefeed或newline以启用行号标记化 前言 我正在使用批处理来完成此操作 尽管在这个主题上有很多“相关”的问题,但这个问题是不同的/不是重复的,因为我想标记行,而不仅仅是“逐行阅读” 我在做什么

Batch file 禁用eol,将delims设置为linefeed或newline以启用行号标记化 前言 我正在使用批处理来完成此操作 尽管在这个主题上有很多“相关”的问题,但这个问题是不同的/不是重复的,因为我想标记行,而不仅仅是“逐行阅读” 我在做什么,batch-file,for-loop,token,newline,Batch File,For Loop,Token,Newline,我想要一种简单的方法来指定我想要解析的行,我认为最好的方法是使用FOR循环的tokens选项。问题在于,默认情况下,令牌由eol设置(默认为换行符)和delims设置(默认为空格)分割。这对于大多数用例来说都很好,但是我想标记每一行。这将使我能够轻松干净地做很多我想做的事情 我怎么试过的 无论如何,我已经发现可以通过在FOR选项中执行eol^=来禁用eol字符。问题是,我找不到需要在delims=中指定的实际字符,以将分隔符设置为等于换行符、换行符或任何其他仅表示新行的字符。我不想简单地逐行处理

我想要一种简单的方法来指定我想要解析的行,我认为最好的方法是使用FOR循环的tokens选项。问题在于,默认情况下,令牌由eol设置(默认为换行符)和delims设置(默认为空格)分割。这对于大多数用例来说都很好,但是我想标记每一行。这将使我能够轻松干净地做很多我想做的事情

我怎么试过的 无论如何,我已经发现可以通过在FOR选项中执行eol^=来禁用eol字符。问题是,我找不到需要在delims=中指定的实际字符,以将分隔符设置为等于换行符、换行符或任何其他仅表示新行的字符。我不想简单地逐行处理,我想标记每一行。这很重要,因为像这样的问题:

这是:

不要申请。此外,我发现了这一点,但答案再次不符合我的实际需要

他们不适用的原因是因为他们要求逐行读取文件。我问的是如何标记每一行。这是不同的,因为逐行读取可以通过禁用delims和eol来完成,或者通过将delims设置为找到的第一个字符/将其设置为空(执行“delims=”)。这不是我想要的,因为我想启用delims,我想让它拆分每一行,而不是eol拆分每一行

你为什么要这么做? 在一些背景故事中,我打算使用skip命令,但是forloop的手册页上说skip选项只会跳到指定的行,不允许你说;跳过三行,读一行,然后再跳过几行,或者按行号跳过。我可以只使用一个forloop来提取一行,然后有更多的forloop,或者用计数器和嵌套for循环来做一些复杂的事情,但是如果我可以简单地标记每一行,那就容易多了

这就是我想要的 实际上,我想要的是:

FOR /F "tokens=1,3 delims=<linefeed go here> eol^=" %%A IN ('command 
that prints out multiple lines') DO (echo %%A)
在DOStips论坛上,我不太明白那里发生了什么。他们是否将换行设置为其他字符?看起来他们也在试图同时使用和禁用熟食店,这对我来说毫无意义

额外:如果我禁用eol错误或其他东西会干扰我当前的方法,请告诉我,如果你能告诉我一个手册或一些我很乐意告诉自己的东西,这样我就不会占用你的时间

为什么这很重要? 因为它使读取文件和从命令输出中只获取所需的行变得更加容易,而不必进行防御,所以将您甚至不需要的行+空格标记化,只获取您需要的行。这样做可以让我直接说(我只想要这些行),我甚至不需要goto或任何奇怪的东西来打破forloop,一旦我抓到了我需要的一切

P>一个完美的例子是考虑下面的文本行,比如说我想从这个文件中只获取E和I。
  • a、b、c
  • d e f
  • g h i
  • j k l
  • 要经常这样做,我需要跳过第一行,开始标记化,获取第二个标记,获取第六个标记,然后使用goto突破。我不想一个令牌一个令牌地计数,我也不想在完成后使用goto来打破循环。我只想说‘抓住第二行和第三行,稍微区别对待它们’。没有gotos,没有计数令牌,没有混乱

    更新我尝试了dostips建议 顺便说一句,这只是试图在我的本地机器上获取所有行的端口打开设置(我正在测试一个Colleuge的批处理脚本)

    但出于某种原因,它没有抛出任何错误,也没有输出任何内容。我希望它输出一些包含我的端口打开设置的行。在forloop中运行命令而不使用delims和eol选项可以很好地工作,例如:

    FOR /F "tokens=*" %%A IN ('netsh firewall show portopening') DO (echo %%A)
    
    更新2 发现这个怪物是从

    实际工作情况与预期相符(由于某些原因,请确保保留间距,因为弄乱会导致上述内容不起作用,而应打印
    ,此处应插入换行符^^^^
    )。唯一的问题是我似乎无法让它在FOR循环中工作。我一直在努力:

    FOR /F "tokens=* delims=%NL% eol^=" %%A IN ('netsh firewall show 
    portopening') DO (echo %%A)
    
    有变化,但似乎什么都不起作用。它只是说
    eol^=“不是预期的
    ,如果我删除
    ”“
    它说
    语法不正确
    。我知道我需要引号,我非常确定
    eol^=
    语法是正确的,所以我认为它与这些东西没有直接关系。我认为delims发生了一些奇怪的事情,导致了不反映实际问题的严重错误

    更新3,兔子洞 请注意,您需要上面的NL或NLM定义来尝试运行这些(尽管它们不起作用) 我试过:

      for /F "tokens^=1,2 delims^= eol^=^^!NLM^^!" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F ^"tokens^=1,2 delims^=!NLM! eol^=^" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "tokens=1,2 delims^=!NLM! eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "tokens=1,2 delims^=!NLM!" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "tokens=1,2 delims= eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "delims=!NLM! eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "delims^=!NLM! eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "delims^=!NLM! eol^=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F ^"delims^=!NLM! eol^=^" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F ^"delims^=^!NLM^! eol^=^" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
    还有其他一些方法,我也用
    %NLM%
    尝试了以上所有方法 我试过使用
    !NL以及所有这些的
    %NL%
    。我尝试过省略选项、重新组合选项、重新排序选项、转义、不转义以及所有其他有趣的组合。大多数情况下都会导致语法错误,有些打印整个输出时使用标记=*,有些打印一些没有意义的东西(奇怪的未标记的基于列的输出,有没有意义的拆分),但它似乎从来没有按标记只打印某些行。此外,手册页还显示
    eol
    默认值为
    并且它用于确定哪些行是注释,而不是结束一行。我只想让分隔符是一个换行符,其他的都不要做任何奇怪的事情。我
    
    FOR /F "tokens=*" %%A IN ('netsh firewall show portopening') DO (echo %%A)
    
    set NLM=^
    
    
    set NL=^^^%NLM%%NLM%^%NLM%%NLM%
    echo There should be a newline%NL%inserted here.
    
    FOR /F "tokens=* delims=%NL% eol^=" %%A IN ('netsh firewall show 
    portopening') DO (echo %%A)
    
      for /F "tokens^=1,2 delims^= eol^=^^!NLM^^!" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F ^"tokens^=1,2 delims^=!NLM! eol^=^" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "tokens=1,2 delims^=!NLM! eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "tokens=1,2 delims^=!NLM!" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "tokens=1,2 delims= eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "delims=!NLM! eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "delims^=!NLM! eol=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F "delims^=!NLM! eol^=" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F ^"delims^=!NLM! eol^=^" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
      for /F ^"delims^=^!NLM^! eol^=^" %%i in ('netsh firewall show 
      portopening') do (echo %%i)
    
    set "lines=1 3"
    FOR /F "tokens=1* delims=:" %%A IN ('command prints lines ^| findstr /N "^"') DO (
       FOR /F "tokens=1*" %%X in ("!lines!") do (
          IF "%%A" EQU "%%X" (
             echo %%B
             set "lines=%%Y"
          )
       )
    )
    
    @echo off
    setlocal EnableDelayedExpansion
    
    set "lines=2 3"
    set "selected="
    FOR /F "tokens=1* delims=:" %%A IN ('type test.txt ^| findstr /N "^"') DO (
       FOR /F "tokens=1*" %%X in ("!lines!") do (
          IF "%%A" EQU "%%X" (
             set "selected=!selected! %%B"
             set "lines=%%Y"
          )
       )
    )
    
    for /F "tokens=2,6" %%A in ("%selected%") do (
       echo Token 2: "%%A"
       echo Token 6: "%%B"
    )
    
    a b c
    d e f
    g h i
    j k l
    
    Token 2: "e"
    Token 6: "i"