好的,在我陈述我的问题之前,让我给你一些背景知识:
我正在为我的朋友创建一个消息服务,我在学校互相发送消息。它是如何工作的基本上每个用户都启动我放在他们计算机上的.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
有没有更简单的方法来完成我正在做的事情?即批处理中的“剪切”命令
答案 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