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
之后产生几乎相同的结果。其中,(
特别有用,因为未定义 something
的 echo %something%
将报告 echo is on/off
,但未定义 something
的 echo(%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
分配给 %%q
,previous-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
您的原始问题以包含格式化数据(如果需要)。如您所见,使用注释并不能使情况变得清晰...
我正在寻找一种从指定行复制到 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
之后产生几乎相同的结果。其中,(
特别有用,因为未定义 something
的 echo %something%
将报告 echo is on/off
,但未定义 something
的 echo(%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
分配给%%q
,previous-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
您的原始问题以包含格式化数据(如果需要)。如您所见,使用注释并不能使情况变得清晰...