vbscript将指定行的文本复制到EOF

时间:2015-01-24 18:55:45

标签: batch-file vbscript

我正在寻找从指定行复制到EOF的方法吗? 我有两个或更多的text.log不时填充,我需要将所有这些数据附加到一个textall.log但记住text.log中的最后一行,因为否则会再次复制textall.log中的所有数据。 / p>

1 个答案:

答案 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-linecounthist分配给%% 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}}原始问题,以便在需要时包含格式化数据。正如您所见,使用评论并不能使情况明确......