我正在寻找从指定行复制到EOF的方法吗? 我有两个或更多的text.log不时填充,我需要将所有这些数据附加到一个textall.log但记住text.log中的最后一行,因为否则会再次复制textall.log中的所有数据。 / p>
答案 0 :(得分:1)
所以 - 看起来你希望将* .log的所有更新累积到textall.log中
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "history=q28129095.history"
PUSHD "%sourcedir%"
:: force history file to eist
ECHO(>>"%history%"
FOR /f "tokens=1*delims=" %%a IN (
'dir /b /a-d "*.log" '
) DO IF /i "%%a" neq "textall.log" (
SET "filename=%%a"
REM find lines in target logfile
FOR /f "tokens=2delims=:" %%q IN ('find /c /v "" "%%a"') DO SET /a lines=%%q
REM locate record of this file in history
SET "hist="
FOR /f "usebackqtokens=1,2delims=:" %%q IN ("%history%") DO IF "%%q"=="%%a" SET "hist=skip=%%r"
REM append new lines to textall.log
CALL :addlines
)
popd
GOTO :EOF
:addlines
FOR /f "usebackq %hist% delims=" %%q IN ("%filename%") DO >>textall.log ECHO(%%q
:: Now maintain the history file
(FOR /f "delims=" %%r IN ('FINDSTR /V /B /L /c:"%filename%" "%history%"') DO echo(%%r)>"%history%.temp"
:: record new start-line
>>"%history%.temp" ECHO(%filename%:%lines%
MOVE /y "%history%.temp" "%history%" >nul
GOTO :eof
您需要更改sourcedir
的设置以适合您的具体情况。
由于缺乏进一步的信息,我假设testxall.log
与所有日志文件位于同一目录中。
您需要将history
设置为适合您的文件名(可能包含路径名)。此文件保留已记录到累计日志的记录。
您需要考虑清除日志文件会发生什么 - 您需要手动维护history
文件。
还要考虑累积的源记录没有指示。
空行将被删除。
对问题报告的回应
我无法重现你的症状。
echo
关键字不应出现在历史记录文件中。请注意,编码非常精确 - echo(
而非echo (
。虽然传统上echo
之后的字符是一个空格,但是有一组字符可以接替o
并产生几乎相同的结果。其中(
特别有用,因为echo %something%
未定义something
将报告echo is on/off
,但echo(%something%
未定义something
将生成新的x1..5.log
线
这是我通过两次运行程序获得的结果;第一次在x5.log
每个中有4行,第二次删除X5.log:4
X1.log:6
X2.log:6
X3.log:6
X4.log:6
,其他第6行删除:
ECHO(>>"%history%"
关于历史文件应该发生什么:
findstr
的开头添加一个空行
这应该只是确保文件存在,因此hist
没有任何可抱怨的内容history
设置为 nothing ,然后检查并标记name
文件。 %%q
分配给previous-linecount
,hist
分配给%% r。如果文件名匹配,则skip=(previous-linecount)
字符串设置为:addlines
findstr
过程中,%filename%
命令允许通过不匹配(/ v)文件名的文字(/ L)的所有行( / c:" string"),它应该删除文件for/f
的任何现有记录。这是通过%%r
命令机械读取的,将整行分配给delims=
(由于echo(
- 这也会删除空行。然而,你可能已经纠正了一些技巧。" (for...etc...echo(%%r)>"temporaryfilename"
我已经涵盖了for
。正如我对其进行编码,然后该行读取
findstr
这里的括号很重要,因为它们用于将/b
的整个响应输出到新文件中。然后将日志文件的名称和行数附加到此临时文件中,并在下一个循环中重命名。
我通过在x2.log
开关中添加edit
来修改 {{1}},以便在行的开头应用文件名匹配。通过这种方式," X2.log"不会删除" anotherlogx2.log"的记录。匹配{{1}}部分。
如果您还有其他问题,请{原因} {{1}}原始问题,以便在需要时包含格式化数据。正如您所见,使用评论并不能使情况明确......