【问题标题】:How do I only assign FOR /F token from one line only in a test file?如何仅在测试文件中仅从一行分配 FOR /F 令牌?
【发布时间】:2011-11-03 03:58:30
【问题描述】:

如何让这个只在 .txt 文件中从第一行获取令牌,而不是遍历每一行。我希望将 %%m 分配给第一行的第三个令牌,然后停止。

@echo off
FOR %%A IN (.\xdrive\*.txt) DO (
  FOR /F "usebackq tokens=3 delims=," %%m IN ("%%A") DO (
    IF "%%m" == "F01" (xcopy /Y "%%A" .\Outbound)
    pause
  )
)
pause

【问题讨论】:

    标签: batch-file for-loop line token


    【解决方案1】:

    黑客=

    @echo off
    FOR %%A IN (.\xdrive\*.txt) DO (
      FOR /F "usebackq tokens=3 delims=," %%m IN ("%%A") DO (
        IF "%%m" == "F01" (xcopy /Y "%%A" .\Outbound)
        GOTO:EOF
      )
    )
    

    所以你所做的只是在第一次通过后转义循环,而不是继续到下一行。

    【讨论】:

      【解决方案2】:

      没有看到 eg 文件并且确切地知道你想要做什么我无法测试这个,但这里是 firstline.bat 的列表,它应该可以满足你的要求:) 起初我认为这需要比它更复杂......在你第一次调用之后,如果只是在第一次调用后使用 goto 退出 for 结构 - 问题解决了吗?

      @echo off
      
      ::: firstline.bat - Retrieve the first line from a series of files
      :::  usage: firstline $filespec
      :::     filespace - files to process (eg .\xdrive\*.txt)
      if "%~1"=="" findstr "^:::" "%~f0"&GOTO:EOF
      
      FOR %%A IN (%1) DO (
        call :testfirst "%%A"
      )
      goto :eof
      
      :testfirst
      FOR /F "usebackq tokens=3 delims=," %%m IN (%1) DO (
        IF "%%m" == "F01" (xcopy /Y %1 .\Outbound)
        goto:eof
      )
      

      【讨论】:

      • goto next 打破了两个 FOR 循环,不仅是内部循环,而且右括号之前的 :next 标签会导致语法错误
      • 谢谢,这看起来很棒。 (%1) 如何知道查看我的 *.txt?由于 .\xdrive*.txt 被替换为 %1 它怎么知道读取文本文件?
      • @jeb - Arg 不测试的危害!用函数调用轻松解决;){更新}
      • @user910557 %1 是对调用批处理文件时使用的第一个参数的引用。如果您实际上将上述代码复制出来,请将其保存到firstline.bat 并执行它,它会告诉您需要提供一个参数(文件规范),在您的情况下,您希望将其称为>firstline .\xdrive\*.txt
      • 因此,如果我有多个文件要传递给它以读取第一行,我是否必须在开头添加另一个 For 语句并调用传递参数的批处理?
      【解决方案3】:

      未经测试

      读取第一行标记3

      for /f "tokens=3 delims=," %%a in ('"findstr /n . %1|findstr /b 1:"') do set fltok3=%%a
      echo(%fltok3%
      

      【讨论】:

        【解决方案4】:

        set /p可以用来读取第一行,然后可以使用FOR /F循环来获取第三个token

        setlocal EnableDelayedExpansion
        FOR %%A IN (%1) DO (
            <%%A set /p firstline=
            FOR /F "tokens=3 delims=," %%m IN ("!firstline!") DO (
                echo %%m
            )
        )
        

        【讨论】:

        • 很好,我也在考虑SET /P。感谢您省去了用它找出实际解决方案的麻烦! :)
        • 谢谢你。相同的 ?关于变量扩展或 %1,我一定有什么不明白的地方。我 %1 什么以及这个脚本如何知道读取 .txt 文件?我已经研究过了,但我只能说 %1 %2.... 是它们代表第一个和第二个参数。不确定这是行还是变量,或者它与源 *.txt 文件的关系如何。再次感谢:)
        【解决方案5】:

        查看这篇文章,它展示了如何使用 dos 批处理文件来模仿 gnu head 实用程序:

        Windows batch command(s) to read first line from text file

        【讨论】:

          猜你喜欢
          • 2011-10-21
          • 2021-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-09
          • 2014-10-02
          相关资源
          最近更新 更多