为文本文件中的每一行增加FOR循环(批处理)

时间:2014-12-08 01:57:04

标签: batch-file for-loop text

好的,在我陈述我的问题之前,让我给你一些背景知识:

我正在为我的朋友创建一个消息服务,我在学校互相发送消息。它是如何工作的基本上每个用户都启动我放在他们计算机上的.bat文件。然后,打开两个窗口:一个输入显示“Text:”,另一个显示另一个文件,显示每秒更新一次的文本文件。当用户输入文本时,它将连接到文本文件。这就是那部分的样子:

:message 
if %a%==1 (
echo %computername% has joined the chatroom at %time%! >> %place%chatroom.chatfile
set a=0
)
cls
echo.
echo.
set /p text="Text: "
if "%text%"=="quit" goto quit
if "%text%"=="clear" goto clear
if "%text%"=="restart" goto startup
goto tidyup
:send
echo %computername% at %time%: %text% >>%place%chatroom.chatfile
goto message  

更新文本文件部分:

:window
cls
type %place%chatroom.chatfile
TIMEOUT /T 1 /NOBREAK > nul
goto window

当我移动时,我意识到如果文本文件超过20行左右,那么你就看不到底部了。我尝试使用more命令来解决这个问题,但这会令人烦恼地向下滚动,以至于你实际上无法读取任何内容。

之后,我找到了一个非常好的解决方案:存储一个名为history.txt的单独文件,并在原始文本文件的行数大于20的条件下将主文本文件的第一行移动到此文件。

同样,我遇到了另一个问题:这只会从文本文件中删除一个行。假设原始文本文件长25行。我该如何移动这些线?

这是我到目前为止所做的:

:tidyup
TIMEOUT /T 1 /NOBREAK > nul
set file=%place%chatroom.chatfile
set /a cnt=0
for /f %%a in ('type "%file%"^|find "" /v /c') do set /a cnt=%%a
set /p firstline=<%file%
if %cnt% GTR 20 (
set /a cnt2=%cnt%-20
for /l %%g in (1, 1, %cnt%) do (
echo %firstline%>>%place%history.chatfile  ::pay attention to this line
)
for /f "skip=%cnt% delims=*" %%a in (%place%chatroom.chatfile) do (
echo %%a >>%place%chatroom2.chatfile    
)
xcopy %place%chatroom2.chatfile %place%chatroom.chatfile /y >nul
del %place%chatroom2.chatfile /f /q)
goto send

我放置::pay attention to this line的行是我需要回答的地方:

如何增加for循环,以便将%cnt%行数从原始文本文件移动到history.chatfile

OR

有没有更简单的方法来完成我正在做的事情?即批处理中的“剪切”命令

1 个答案:

答案 0 :(得分:3)

@ECHO OFF
SETLOCAL
SET "file=q27350263.txt"
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
:: read lines from file into variables "$1..$asmanylinesasthereare"
SET /a cnt=0
for /f "delims=" %%a in ('type "%file%"') do (
 set /a cnt+=1
 CALL SET $%%cnt%%=%%a
)
SET /a cnthist=cnt-20
SET /a cntlive=cnthist+1
IF %cnt% gtr 20 (
 DEL "%file%"
 FOR /l %%a IN (1,1,%cnthist%) DO CALL >>"%file%.history" ECHO(%%$%%a%%
 FOR /l %%a IN (%cntlive%,1,%cnt%) DO >>"%file%" CALL ECHO(%%$%%a%%
)


GOTO :EOF

我使用了一个名为q27350263.txt的文件,其中包含一些数据供我测试。您需要做的就是更改文件名以适合自己。

基本上,这样做是将聊天文件q27350263.txt的内容加载到变量$ 1 .. $ 25(或其他)中然后因为我们知道行的数量(在cnt中)我们可以确定哪些行登陆历史文件($ 1 .. $(cnt-20))并返回聊天文件($(cnt-20 + 1).. $ cnt)。

call echo语法允许您在变量发生变化时访问变量的值。在第一个实例中,批处理解析CALL SET $%%cnt%%=%%a并执行set $%cnt%=value from line,以便$thecurrentvalueofcnt从当前行接收文本。

在第二对实例中,%% a包含一个数字,因此call echo的目标是%$1%(其中1是%%a的值)

请注意,重定向器可以放在call

的任意一侧