如何制作只显示文本文件最后一行的批处理脚本?

这可能已经得到了答复,但我无法find任何关于这个话题。 我试图做批量聊天信使,为此我需要显示文本文件的最后一行。 这是我试过的(不是很优雅):

@echo off FOR /F %%x in (address.txt) DO set address=%%x :A IF NOT EXIST "%address%" GOTO A GOTO B :B SET skipcount=1 :C FOR /f "skip=%skipcount%" %%m in (%address%) DO ECHO %%m SET m1=%%m :D FOR /f %%m IN (%address%) DO ECHO %%m > NUL IF NOT %%m==%m1% SET skipcount=%skipcount%+1 GOTO D GOTO C 

这可能工作,但我认为这是充满错误的例子语法错误^^所以我只是想获得一些提示,什么是错的:)

这里是一个纯批量工具 (不需要外部工具),可以显示一系列编号的行

显示最后一行使用它是这样的:

 call tailHead.bat -file=address.txt -end=1 

您可以使用我的JREPL.BAT正则表达式文本处理实用程序来创建尾部命令。 JREPL.BAT是纯粹的脚本(混合JScript /批处理),可以从XP以后的任何Windows机器上本机运行。

以下命令将显示chat.txt中的最后一行

 call jrepl .* $0 /jmatch /c /jbegln "skip=(ln<cnt)" /f chat.txt 

但是有一个更好的方法来开发批量聊天程序(假设这是一个有价值的目标)

您可以在循环中进行批处理,并将输入重定向到循环之外,循环将读取和新写入新添加的行。 您可以使用SET / P和ECHO,但使用单个FINDSTR会更简单。 这是有效的,因为FINDSTR在调用时不会重置文件指针,详见http://www.dostips.com/forum/viewtopic.php?p=9720#p9720

您应该使用一些命令暂停显示循环内的处理,以防止循环占用100%的CPU内核。 你可以使用TIMEOUT或者PING hack,但是会引入大约1秒的延迟。 我选择使用PATHPING来引入〜0.2秒的延迟。

另外,如果两个进程同时写入同一个文本文件,则必须担心防止冲突。 这可以通过使用锁定文件来解决, 如何在Windows下共享日志文件? 。

下面是一个基本的批量聊天程序的开始。 它的工作方式是让两个或两个以上的用户导航到同一个共享目录,然后运行chat.bat sessionName ,其中sessionName是共享聊天文件的一致同意名称。 每个用户将在主控制台窗口中显示共享聊天对话框,并打开一个新的控制台窗口,在那里他们可以将他们的贡献写入对话。 输入:quit以退出聊天程序。

 @echo off setlocal disableDelayedExpansion if "%~1" equ ":input" goto :startInput if "%~1" equ ":display" goto :display set "base=%~1" set "dialog=%base%.chat" set "quitfile=%base%_%username%.chat.quit" start "" "%~f0" :input del "%quitfile%" 2>nul cmd /c "%~f0" :display del "%quitfile%" 2>nul exit /b :display title Chat Dialog set "quit=" if not exist "%dialog%" (call ) >>"%dialog%" <"%dialog%" ( for /l %%N in () do ( if exist "%quitfile%" set "quit=1" findstr "^" if defined quit exit pathping -p 150 -q 2 localhost >nul )) :startInput setlocal enableDelayedExpansion title Chat Input call :write ">>> %username% has joined the conversation" :input cls set "text=" set /p "text=>" if /i !text! equ :quit ( call :write "<<< %username% has left the conversation" copy nul "!quitfile!" exit ) call :write goto :input :write if "%~1" neq "" (set "text=%~1") else (set "text=%username%: !text!") 2>nul ( >>"!dialog!" ( echo(!text! (call ) ) || goto :write ) exit /b 

还有待完成:

  • 提供一个邀请用户聊天的机制。
  • 提供一个选项来清除新聊天会话开始时的聊天内容(如果旧的sessionName被重用)
  • 提供:list命令列出当前参与的用户。 这需要创建sessionNameUserId文件,只要用户仍在监听和/或参与,文件就会保持锁定状态。 显示循环可以通过文件接收一个:list命令,就像我实现的一样:退出,然后它可以尝试打开每个sessionNameuserID文件进行写入。 如果失败,则用户仍然处于活动状态,并且应列出名称。
  • 我相信还有其他的东西可能是有用的。