如何批量显示.txt文件中的行窗口?

时间:2015-12-13 22:47:45

标签: windows batch-file

所以我正在批量构建一个消息传递程序(我知道,这是新手),程序接受用户输入,将其放在我的.txt文件log.txt中,并在屏幕上输入。我希望输出看起来像这样......

Title
----------------------
contents
of
the
file
here
----------------------
User input here>>

这可能看起来很简单,但用户会不断更新该文件,我希望程序只显示一系列行以保持该消息区域保持相同的大小。我发现了一个显示特定行的简单程序,但每次log.txt更改时我都无法将它们向下移动一行。这是:

@setlocal enableextensions enabledelayedexpansion
@echo off
set lines=1
set curr=1
for /f "delims=" %%a in ('type bob.txt') do (
    for %%b in (!lines!) do (
        if !curr!==%%b echo %%a
    )
    set /a "curr = curr + 1"
)
endlocal

(顺便说一下,这个程序名为lines.bat。我只是call它在cmd中进行测试。)

1 个答案:

答案 0 :(得分:0)

要从特定行号开始返回指定数量的行,您可以执行以下操作:

@echo off
setlocal EnableExtensions

rem define the (path to the) text file here:
set "TEXT_FILE=log.txt"
rem define the line number here:
set /A "LINE_NUMBER=1"
rem define the number of lines here:
set /A "LINE_COUNT=5"

set /A "LINE_LIMIT=LINE_NUMBER+LINE_COUNT-1"
for /F delims^=^ eol^= %%L in ('findstr /N /R "^" "%TEXT_FILE%"') do (
    setlocal DisableDelayedExpansion
    set "LINE=%%L"
    setlocal EnableDelayedExpansion
    for /F "tokens=1 delims=:" %%N in ("!LINE!") do set "LNUM=%%N"
    set "LINE=!LINE:*:=!"
    if !LNUM! GEQ !LINE_NUMBER! (
        if !LNUM! LEQ !LINE_LIMIT! (
            echo !LINE!
        )
    )
    endlocal
    endlocal
)
endlocal

使用findstr /R搜索模式的"^"命令会返回所有行。 findstr开关/N允许每行前面有一个行号(从1开始)和冒号。 :用于将行分为两部分:检查表示行号的第一部分是否在要返回的范围内;第二部分是原始的文本行,只是输出以防万一。甚至空行都被考虑在内。

您可能会问为什么不简单地使用上面提到的:作为delims的{​​{1}}分隔符选项,但这会导致以for /F开头的文本行出现问题

例如,delayed expansion的切换是必要的,以避免像:这样的特殊字符出现问题。

要返回最后定义的行数,可以使用以下方法:

!

再次使用@echo off setlocal EnableExtensions rem define the (path to the) text file here: set "TEXT_FILE=log.txt" rem define the number of lines here: set /A "LINE_COUNT=5" for /F "tokens=1 delims=:" %%L in ('findstr /N /R "^" "%TEXT_FILE%"') do ( set /A "LINE_SKIP=%%L" ) set /A "LINE_SKIP-=LINE_COUNT" if %LINE_SKIP% GTR 0 ( set "LINE_SKIP=skip^=%LINE_SKIP%^ " ) else ( set "LINE_SKIP=" ) for /F %LINE_SKIP%delims^=^ eol^= %%L in ('findstr /N /R "^" "%TEXT_FILE%"') do ( setlocal DisableDelayedExpansion set "LINE=%%L" setlocal EnableDelayedExpansion set "LINE=!LINE:*:=!" echo !LINE! endlocal endlocal ) endlocal 命令。但是在这里,我们首先有一个额外的findstr /N /R "^"循环,它只计算文本文件中的行数,提取前面带有for /F的行号。第二个findstr循环与上述方法非常相似,但引入了动态for /F选项,因此循环开始只迭代最后一行;其余几乎与上述相同,只是有关当前行号的条件已被删除。

我知道我也可以使用skip而不是循环遍历find /C /V ""输出来计算行数,但如果文件末尾有一个或多个空行,{{ 1}}返回的数字少于findstr /N /R "^"方法,因此我始终追求find

同样在这里,切换delayed expansion以避免findstr字符出现问题。