2014-12-08 71 views
0

好吧,之前我說明我的問題,讓我爲你提供一些背景:在一個文本文件遞增FOR循環的每一行(批)

我爲我的朋友創造一個短信服務,我對消息中的每個其他在學校。它的工作原理基本上是每個用戶啓動我放在他們電腦上的.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

從原來的文本文件中的行量是否有一個更簡單的方式太一plish我在做什麼?即在批量

回答

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文件。所有你需要做的就是改變文件名以適應你自己。因爲我們知道線的數量(在cnt),我們可以確定哪些線落在了哪些線上歷史文件($ 1.. $(cnt-20)),並返回到聊天文件($(cnt-20 + 1).. $ cnt)。

call echo語法允許您在變量更改時訪問該變量的值。在第一種情況下,批量解析CALL SET $%%cnt%%=%%a並執行set $%cnt%=value from line,因此$thecurrentvalueofcnt接收來自當前行的文本。

在第二對實例,%%一個包含許多所以call echo的目標是%$1%(其中1是的%%a的值)

注意,重定向器可以放置在call的任一側

+0

非常感謝!我只需要做一些小的調整就可以使它適合我的程序。 – ajc2000 2014-12-08 22:46:09

相關問題