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

vbscript copy text from specified line to EOF

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

所以 - 您似乎希望将所有更新累积到 *.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 之后的字符是 space,但有一组字符可能会在 o 之后产生几乎相同的结果。其中,( 特别有用,因为未定义 somethingecho %something% 将报告 echo is on/off,但未定义 somethingecho(%something% 将生成新的行

这是我两次运行套路得到的结果;第一次在 x1..5.log 中删除了 4 行,第二次删除了 x5.log,其他的删除了 6 行:

X5.log:4
X1.log:6
X2.log:6
X3.log:6
X4.log:6

关于历史文件应该发生的事情是:

  • ECHO(>>"%history%"
    在开头添加了一个空行 这应该只是确保文件存在,所以 findstr 没有什么可抱怨的
  • 对于每个日志文件,hist 设置为 nothing 然后 history 文件被检查和标记化。 name 分配给 %%qprevious-linecount 分配给 %%r。如果文件名匹配,则 hist 字符串设置为 skip=(previous-linecount)
  • :addlines 过程中,findstr 命令允许通过所有 匹配 (/v) 文字 (/L ) 的文件名 (/c:"string"),这应该删除文件 %filename% 的任何现有记录。这是由 for/f 命令机械读取的,将整行分配给 %%r(因为 delims= - 这也会删除空行。

有一个小技巧,但是您可能 "corrected." echo( 我已经介绍过了。正如我编码的那样,该行显示为

(for...etc...echo(%%r)>"temporaryfilename"

此处的括号很重要,因为它们用于将 for 的整个响应输出到新文件中。然后将日志文件的名称和行数附加到此临时文件,并为下一个周期重命名。

我在这里修改了 findstr,添加了一个 /b 开关,使文件名匹配应用于行首.这样,"X2.log"就不会通过匹配x2.log部分来删除"anotherlogx2.log"的记录了。

如果您还有其他问题,请 edit 您的原始问题以包含格式化数据(如果需要)。如您所见,使用注释并不能使情况变得清晰...