所以我正在批量构建一个消息传递程序(我知道,这是新手),程序接受用户输入,将其放在我的.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中进行测试。)
答案 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
字符出现问题。