如何逐行读取和打印文本文件的内容?

时间:2018-07-29 01:54:55

标签: batch-file cmd

因此,我不知道如何一次从一个* .txt文本文件中获取CMD回显行,并稍有延迟以使其看起来像正在处理。

单批处理是否有可能?

我尝试进行研究,但是我找不到足够的文本操作来做到这一点,但是我确实知道如何在每个命令之间进行暂停以及如何执行循环。

3 个答案:

答案 0 :(得分:2)

尽管您的问题不在主题之内,但我还是决定将其包括在内,因为已经有两个答案,并且只需一行即可实现。

从批处理文件中:

@For /F Tokens^=1*Delims^=]^ EOL^= %%A In ('Find /N /V ""^<"C:\test.txt"') Do @Echo(%%B&>Nul PathPing 127.0.0.1 -n -q 1 -p 450

从命令提示符处:

For /F Tokens^=1*Delims^=]^ EOL^= %A In ('Find /N /V ""^<"C:\test.txt"') Do @Echo(%B&>Nul PathPing 127.0.0.1 -n -q 1 -p 1350

两个示例都没有从源文件C:\test.txt中删除空行,可以根据需要进行更改
我已将PathPing用作'小延迟”,因为它似乎更可控; 要调整延迟,您需要做的就是更改最后一个数字,直到找到最令人满意的输出为止。

答案 1 :(得分:1)

尝试使用此批处理脚本:

@echo off
Title Read line by line with delay
set "InputFile=TestFile.txt"
set "delay=1" Rem Delay one seconds, you can change it for your needs
setlocal enabledelayedexpansion
for /f "tokens=*" %%A in ('Type "%InputFile%"') do (
  set /a N+=1
  set "Line[!N!]=%%A"
)

for /l %%i in (1,1,%N%) do (
    echo !Line[%%i]!
    Timeout /T %delay% /nobreak>nul
)
pause

答案 2 :(得分:1)

我们假设要逐行输出文本文件TestFile.txt,它是ANSI编码的文本文件,仅包含此文本的ASCII字符:

Line 1 is with nothing special. Next line 2 is an empty line.

;Line 3 with a semicolon at beginning.
   Line 4 has leading spaces.
    Line 5 has a leading horizontal tab.
Line 6 is with nothing special. Next line 7 has just a tab and four spaces.

Line 8 is ! with exclamation marks ! in line!
? Line 9 starts with a question mark.
: Line 10 starts with a colon.
] Line 11 starts with a closing square bracket.

下面的批处理文件逐行输出此文本文件,每行之间有一秒钟的延迟,但第二行完全为空。

@echo off
title Read line by line with delay
setlocal EnableExtensions DisableDelayedExpansion

rem Use command TIMEOUT by default for 1 second delay. But use
rem PING in case of TIMEOUT does not exist as on Windows XP.
set "DelayCommand=%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK"
if not exist %SystemRoot%\System32\timeout.exe set "DelayCommand=%SystemRoot%\System32\ping.exe 127.0.0.1 -n 2"

for /F "usebackq eol= delims=" %%A in ("TestFile.txt") do (
    echo(%%A
    %DelayCommand% >nul
)
endlocal
pause

eol=之后看起来很奇怪的字符是带有十六进制代码值0C的换页控制字符,用于输出第三行正确的字符。由于重新定义了行尾字符,因此不会输出以换行开头的行。

此代码并非旨在输出具有任何类型的字符编码的任何类型的文本文件,而与文本文件包含的字符无关。 Windows命令行环境不适用于输出任何文本文件。

还可以使用其他未引用的语法来指定 FOR 选项delimseolusebackq,以定义一个空的定界符列表没有换行符:

@echo off
title Read line by line with delay
setlocal EnableExtensions DisableDelayedExpansion

rem Use command TIMEOUT by default for 1 second delay. But use
rem PING in case of TIMEOUT does not exist as on Windows XP.
set "DelayCommand=%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK"
if not exist %SystemRoot%\System32\timeout.exe set "DelayCommand=%SystemRoot%\System32\ping.exe 127.0.0.1 -n 2"

for /F usebackq^ delims^=^ eol^= %%A in ("TestFile.txt") do (
    echo(%%A
    %DelayCommand% >nul
)
endlocal
pause

感谢使用三个转义字符^来转义三个 FOR 选项的替代语法,aschipfl使用转义字符和空格而不是用双引号引起来的选项字符串。

这里有(而不是通常用来输出的正确的空格,也就是只有制表符和一些普通空格的第7行。另请参阅DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/。我最喜欢echo/%%A不会纠正以问号开头的输出行9。

无法使用 FOR 不忽略空行的选项进行定义。但是可以使用 FIND FINDSTR 输出文本文件,该文本文件的所有行开头都带有行号,因此不再有空行。行号括在方括号(FIND)中,或与冒号(FINDSTR)分隔。可以仅在行号之后]:的第一个序列之后的字符串分配给循环变量,这在大多数情况下意味着整行与文本文件中的一样。但是,如果文本文件中的一行偶然以]:开头,则 FOR 也会删除该分隔符。解决方法是以下代码:

@echo off
title Read line by line with delay
setlocal EnableExtensions DisableDelayedExpansion

rem Use command TIMEOUT by default for 1 second delay. But use
rem PING in case of TIMEOUT does not exist as on Windows XP.
set "DelayCommand=%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK"
if not exist %SystemRoot%\System32\timeout.exe set "DelayCommand=%SystemRoot%\System32\ping.exe 127.0.0.1 -n 2"

for /F delims^=^ eol^= %%A in ('%SystemRoot%\System32\findstr.exe /N "^" "TestFile.txt" 2^>nul') do (
    set "Line=%%A"
    setlocal EnableDelayedExpansion
    echo(!Line:*:=!
    endlocal
    %DelayCommand% >nul
)
endlocal
pause

FINDSTR 在由 FOR 使用cmd /C和{{1 }}被分配给循环变量',后者被分配到环境变量A的旁边。

然后,需要为下一行启用延迟扩展,这会导致在创建当前环境变量列表的副本之前将当前环境变量列表的地址以及堆栈的当前目录路径,命令扩展状态和延迟扩展状态推送到堆栈

接下来,输出环境变量Line的值,但是用所有内容将直到第一个冒号替换为空,这将导致输出的真实行存储在文本文件中,而没有行号并在 FINDSTR 开头插入冒号。

最后,从内存中删除创建的环境变量列表的副本,并从堆栈中弹出并设置延迟扩展和命令扩展的先前状态,并将当前目录路径再次设置为环境变量的当前目录和先前地址还原列表以还原环境变量列表。

在文本文件中为每一行运行命令Linesetlocal EnableDelayedExpansion当然不是很有效,这不仅要启用/禁用延迟扩展,但这在获取行中是必须的将感叹号正确分配给环境变量endlocal,然后处理,更正Line的值。由于每条线的输出之间延迟一秒钟,因此效率损失在这里并不是真正的问题。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • Line
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • if /?
  • ping /?
  • rem /?
  • set /?