Batch file 批处理脚本-逐行读取

Batch file 批处理脚本-逐行读取,batch-file,Batch File,我有一个日志文件,我需要逐行读取,并将该行传输到下一个循环 首先,我将日志文件中的“main”字(比如“error”)放在一个单独的文件中,以保持其较小。现在,我需要将单独的文件一行一行地读取-每一行都需要转到另一个循环(在这些循环中,我对日志进行grep并将其划分为块),但我仍然停留在这里 原木看起来像 xx.xx.xx.xx - - "http://www.blub.com/something/id=?searchword-yes-no" 200 - "something_else" 使用

我有一个日志文件,我需要逐行读取,并将该行传输到下一个循环

首先,我将日志文件中的“main”字(比如“error”)放在一个单独的文件中,以保持其较小。现在,我需要将单独的文件一行一行地读取-每一行都需要转到另一个循环(在这些循环中,我对日志进行grep并将其划分为块),但我仍然停留在这里

原木看起来像

xx.xx.xx.xx - - "http://www.blub.com/something/id=?searchword-yes-no" 200 - "something_else"
使用for/f循环,我只得到IP,而不是完整的线路

如何对整行进行管道/写入/缓冲?(不管每行写什么)

试试这个:

@echo off
for /f "tokens=*" %%a in (input.txt) do (
  echo line=%%a
)
pause
由于
标记=*
所有内容都被捕获到
%a

编辑: 要回复您的评论,您必须这样做:

@echo off
for /f "tokens=*" %%a in (input.txt) do call :processline %%a

pause
goto :eof

:processline
echo line=%*

goto :eof

:eof
由于空格的原因,您不能使用
%1
,因为在第一个空格之前,该部分只包含零件。由于该行包含引号,因此也不能将
:processline“%%a”
%~1
结合使用。因此,您需要使用
%*
,它将获得
%1%2%3…
,因此整个线路。

呼叫解决方案存在一些问题

由于解析器对
调用
的参数进行了两次解析,因此许多不同的内容都会失败。
这些线路或多或少会产生一些奇怪的问题

one
two%222
three & 333
four=444
five"555"555"
six"&666
seven!777^!
the next line is empty

the end
因此,您不应该在调用中使用
%%a的值,最好将其移动到一个变量,然后仅使用变量名称调用函数

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "myVar=%%a"
    call :processLine myVar
)
goto :eof

:processLine
SETLOCAL EnableDelayedExpansion
set "line=!%1!"
set "line=!line:*:=!"
echo(!line!
ENDLOCAL
goto :eof

这在过去对我很有效,如果可以的话,它甚至可以扩展文件中的环境变量

for /F "delims=" %%a in (LogName.txt) do (
     echo %%a>>MyDestination.txt
)

对于路径中有空格的用户,您将需要以下内容: n、 它扩展到一个绝对路径,而不是相对路径,所以如果您运行的目录路径中有空格,这些空格也会计算在内

set SOURCE=path\with spaces\to\my.log
FOR /F "usebackq delims=" %%A IN ("%SOURCE%") DO (
    ECHO %%A
)
解释:

(path\with spaces\to\my.log)
将不分析,因为是空格。 如果变成:

("path\with spaces\to\my.log")
它将作为字符串而不是文件路径处理

"usebackq delims=" 

将允许该路径用作路径(感谢Stephan)。

thx的可能副本-工作正常。您能解释一下为什么(searchpattern.txt)do(call:PROCESS4%%F)GOTO END4:PROCESS4 set var4=%1 GOTO END4:END4中的以下语句对/F%%F不起作用吗?其基本相同。我知道,如果没有“代币”的定义,它将需要整行代码,并将其放入var4中,我可以使用它。但是为什么它不起作用请在黑暗中带来光明谢谢you@user553499,我编辑了我的答案,解释了如何结合电话来做这件事。我不是在问问题,而是在回答。所以我猜答案并不清楚这就是开关
usebackq
存在的原因<代码>更多
对于大文件来说是一个糟糕的选择,因为它会在批处理模式下每64k(如果我没记错的话)等待一次按键,并用空格替换制表符<代码>类型将是更好的选择。最佳解决方案:`for/f“usebackq delims=“%%A in”(“file with spaces.txt”)do…'谢谢Stephan!在漫长的一天结束时,我试图找出一位同事的脚本出了什么问题,发现他们会从这里复制代码,所以想让它浮动,这样其他人就不会做同样的事情了“类型”确实是我想要的。作为一个注释-‘more’是一页一页地工作的,没有一个页面可以限制它,我的理解是它将继续运行(只是在2MB日志上运行)。“没有页面限制”是不正确的。我承认65536行是一个很长的限制,但是(一个日志文件可能很容易克服这个限制)啊,我把它理解为64k字节(因此提到了文件大小)。是的,一个日志当然会。此外,对于长文件,“更多”似乎速度非常慢(可能是因为它从未达到预期用途)。