批量打印特定文本行到文件

时间:2017-08-24 21:13:27

标签: windows batch-file

首先我要说的是我对此非常陌生,以及我在本网站上发现的拼凑的小代码。

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

我开始从文本文件中的目录列表中提取行。我可以使用此帖子中的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
        )
    )

1 个答案:

答案 0 :(得分:0)

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括号中。这还有其他优点 - 比如在setlocal之后立即执行@echo off,然后当例程终止时,环境将返回到其原始状态 - 它不会累积更改(通常添加变量)越来越多的批次运行。

我所做的其他一些改变是化妆品。 set /a中的引号是多余的,goto中的冒号也是多余的(只有goto :eof除外)

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

在第一个代码片段中,findstr的输出分配给%%a,内部for将分隔符前findstr的那部分分配给%%b 1}}以及之后%%c。您显然希望选择等于%%b的行%x%,以便代码进行比较,如果相等,则将%%c(其余行)和title=%%c输出到文件中来自Lable和行号。 (你拼写错误label);然后递增x并再次尝试。

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

要完成的事情是回显文件中的行(在%%b中,碰撞行号并重​​新开始......