这可能已经得到了答复,但我无法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
还有待完成: