Batch file 文本文件(批处理)中每行的循环递增
好的,在我陈述我的问题之前,让我向您提供一些背景信息: 我正在为我和我的朋友们创建一个信息服务,以便他们在学校互相发送信息。它的工作原理基本上是每个用户启动我放在他们计算机上的.bat文件。然后,两个窗口打开:一个窗口的输入为“Text:”,另一个窗口实际上是另一个文件,显示每秒更新一次的文本文件。当用户输入文本时,它将连接到文本文件。这是该部分的外观: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
: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
的文件,其中包含一些用于测试的数据。您所需要做的就是更改文件名以适合自己