【问题标题】:Batch to Print specific lines of text to a file批量将特定的文本行打印到文件中
【发布时间】:2017-08-24 21:13:26
【问题描述】:

首先让我说我对此很陌生,我在这个网站上发现了我拼凑在一起的小代码。

最后,我需要一个批处理,它在运行时会抓取父目录中的每个文件夹名称。并将其复制到名为 label1、label2 等的文本文件中。

我首先从文本文件的目录列表中提取行。我可以让它使用这篇文章中的 Seth 代码将最后一行回显到文件中 Windows Batch file to echo a specific line number

我做了一些修改,试图把它放在一个循环中,现在我什么也没得到。

如果有人可以帮助我,将不胜感激。到目前为止,这是我的代码。

    set /a "x=1"
    set /a "lines=91"
    :while1
        if %x% leq %lines% (
        for /f "tokens=*" %%a in ('findstr /n .* "Y:\Test\foldernametest.txt"') do (
      set "FullLine=%%a"
      for /f "tokens=1* delims=:" %%b in ("%%a") do (
        setlocal enabledelayedexpansion
        set "LineData=!FullLine:*:=!"
        if "%%b" equ "%1" echo(!LineData!
        echo title=!linedata! > Lable%x%.dat
        set /a "x= x+1"
        endlocal
        goto :while1
        )
    )

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:
    setlocal enabledelayedexpansion
    set /a x=1
    set /a lines=91
    :while1
        if %x% leq %lines% (
        for /f "tokens=*" %%a in ('findstr /n .* "Y:\Test\foldernametest.txt"') do (
        for /f "tokens=1* delims=:" %%b in ("%%a") do (
          if "%%b" equ "%x%" (
            echo(%%c
            echo title=%%c > Lable%x%.dat
            set /a x= x+1
            goto while1
          )
        )
    )
    endlocal
    

    我有理由相信这会奏效

    setlocal enabledelayedexpansion
    set /a x=1
    set /a lines=91
    :while1
        if %x% leq %lines% (
        for /f "tokens=1* delims=:" %%a in ('findstr /n .* "Y:\Test\foldernametest.txt"') do if %%a==%x% (
        echo(%%b
        echo title=%%b > Lable%x%.dat
        set /a x= x+1
        goto while1
        )
    )
    endlocal
    

    您的代码的问题是 endlocal 终止了 setlocal 并且自 setlocal 后发生的所有环境更改都被退出 - 环境恢复到 setlocal 时的状态被处决了。

    结果是,使用您的代码,您将递增 x(变量的大名称),然后在执行 endlocal 时取消递增。

    所以 - 将整个例程放在 setlocal/endlocal 括号中。这还有其他优点 - 例如,如果您在 @echo off 之后立即执行 setlocal,那么当例程终止时,环境将返回到其原始状态 - 它不会随着越来越多的批次累积更改(通常是添加变量)正在运行。

    我所做的其他一些更改是装饰性的。 set /a 中的引号是多余的,goto 中的冒号也是多余的(goto :eof 除外)

    您遇到的另一个问题是%1(意思是“例程的第一个参数”),您的意思可能是“%x%”。

    在第一个代码片段中,findstr 的输出分配给%%a,内部for 将分隔符之前的findstr 部分分配给%%b,之后分配给%%c .您显然想要选择等于%x% 的行%%b,因此代码进行比较,如果相等,则将%%c(行的其余部分)和title=%%c 输出到由Lable 和行号创建的文件. (你拼错了label);然后递增 x 并重试。

    第二段代码是第一段代码的简化。该行从文件中读取并编号,然后直接在冒号上拆分; %%a 获取数字,%%b 获取该行的其余部分,所以如果 %%a 与数字 %x% 相同,那么我们想做一些事情(不需要引号,因为 %%a 是一个简单的数字字符串并且x 也将是数字,因为它从未分配给包含分隔符的字符串)。

    要做的事情是从文件中回显该行(在%%b中,颠倒行号并重新开始......

    【讨论】:

    • 这非常有效。感谢您的帮助和他们非常详细的解释,我将再阅读大约 5 次,看看我是否理解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多