Batch file 文本文件(批处理)中每行的循环递增

Batch file 文本文件(批处理)中每行的循环递增,batch-file,for-loop,text,Batch File,For Loop,Text,好的,在我陈述我的问题之前,让我向您提供一些背景信息: 我正在为我和我的朋友们创建一个信息服务,以便他们在学校互相发送信息。它的工作原理基本上是每个用户启动我放在他们计算机上的.bat文件。然后,两个窗口打开:一个窗口的输入为“Text:”,另一个窗口实际上是另一个文件,显示每秒更新一次的文本文件。当用户输入文本时,它将连接到文本文件。这是该部分的外观: :message if %a%==1 ( echo %computername% has joined the chatroom at %t

好的,在我陈述我的问题之前,让我向您提供一些背景信息:

我正在为我和我的朋友们创建一个信息服务,以便他们在学校互相发送信息。它的工作原理基本上是每个用户启动我放在他们计算机上的.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
:tidyup
超时/T1/NOBREAK>nul
设置文件=%place%chatroom.chatfile
设置/a cnt=0
对于/f%%a in('type”%file%%“^ | find”“/v/c'),请设置/a cnt=%%a
set/p firstline=>%place%history.chatfile::注意这一行
)
对于/f“skip=%cnt%delims=*”%%a in(%place%chatroom.chatfile)do(
echo%%a>>%place%chatroom2.chatfile
)
xcopy%place%chatroom2.chatfile%place%chatroom.chatfile/y>nul
删除%place%chatroom2.chatfile/f/q)
转到发送
我放置
的那一行::注意这一行
就是我需要回答这个问题的地方:

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

有没有更简单的方法来完成我正在做的事情?即,批量执行“切断”命令

@ECHO OFF
SETLOCAL
设置“file=q27350263.txt”
::删除开始时的变量$
对于/F“delims=”('set$2^>Nul')中的%%a,请执行设置“%%a=”
::将文件中的行读入变量“$1..$asmanylinessthereare”
设置/a cnt=0
对于/f“delims=“%%a in('类型“%file%”)do(
设置/a cnt+=1
调用集$%%cnt%%=%%a
)
设置/a cnthist=cnt-20
设置/a cntlive=cnthist+1
如果%cnt%gtr 20(
删除“%file%”
对于(1,1,%cnthist%)中的/l%%a,请调用>>%file%.history”回显(%%$%%a%%)
对于(%cntlive%,1,%cnt%)中的/l%%a,请执行>>%file%%调用ECHO(%%$%%a%%
)
后藤:EOF
我使用了一个名为
q27350263.txt
的文件,其中包含一些测试数据。您需要做的就是更改文件名以适合自己

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

call echo
语法允许您在变量更改时访问变量的值。首先,批处理解析
call SET$%%cnt%%=%%a
并执行
SET$%cnt%=第行的值,因此
$currentValueOfCnt
从当前行接收文本

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

请注意,重定向器可以放置在
呼叫的任一侧

@ECHO OFF
SETLOCAL
设置“file=q27350263.txt”
::删除开始时的变量$
对于/F“delims=”('set$2^>Nul')中的%%a,请执行设置“%%a=”
::将文件中的行读入变量“$1..$asmanylinessthereare”
设置/a cnt=0
对于/f“delims=“%%a in('类型“%file%”)do(
设置/a cnt+=1
调用集$%%cnt%%=%%a
)
设置/a cnthist=cnt-20
设置/a cntlive=cnthist+1
如果%cnt%gtr 20(
删除“%file%”
对于(1,1,%cnthist%)中的/l%%a,请调用>>%file%.history”回显(%%$%%a%%)
对于(%cntlive%,1,%cnt%)中的/l%%a,请执行>>%file%%调用ECHO(%%$%%a%%
)
后藤:EOF
我使用了一个名为
q27350263.txt
的文件,其中包含一些测试数据。您需要做的就是更改文件名以适合自己

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

call echo
语法允许您在变量更改时访问变量的值。首先,批处理解析
call SET$%%cnt%%=%%a
并执行
SET$%cnt%=第行的值,因此
$currentValueOfCnt
从当前行接收文本

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

请注意,重定向器可以放置在
呼叫的任一侧

@ECHO OFF
SETLOCAL
设置“file=q27350263.txt”
::删除开始时的变量$
对于/F“delims=”('set$2^>Nul')中的%%a,请执行设置“%%a=”
::将文件中的行读入变量“$1..$asmanylinessthereare”
设置/a cnt=0
对于/f“delims=“%%a in('类型“%file%”)do(
设置/a cnt+=1
调用集$%%cnt%%=%%a
)
设置/a cnthist=cnt-20
设置/a cntlive=cnthist+1
如果%cnt%gtr 20(
删除“%file%”
对于(1,1,%cnthist%)中的/l%%a,请调用>>%file%.history”回显(%%$%%a%%)
对于(%cntlive%,1,%cnt%)中的/l%%a,请执行>>%file%%调用ECHO(%%$%%a%%
)
后藤:EOF
我使用了一个名为
q27350263.txt
的文件,其中包含一些用于测试的数据。您所需要做的就是更改文件名以适合自己