我有一个文件夹中的文本文件列表,我想:
在文件夹
在最新的文件中,找到string =“Error”
使用string =“Error”
如果找到的错误超过1个,请同样复制
下面的脚本很简单,我对批处理脚本很新,可以帮我纠正使它工作吗?
set today=%date:~10,4%%date:~4,2%%date:~7,2%
set today_day=%date:~7,2%
set today_year=%date:~10,4%
set today_month=%date:~4,2%
set log_path=C:\path\Log\
set string=Error
FOR /F "delims=" %%I IN ('DIR %log_path%\*.* /A:-D /O:-D /B') do set LATEST=%%I
If findstr /I /R /C:"%string%" %%I Do
Echo Copy the Error Message row
Else exit
答案 0 :(得分:0)
你想的更容易一些。 (而你的if
逻辑根本不起作用)
FOR /F "delims=" %%I IN ('DIR %log_path%\*.* /A:-D /O:D /B') do set "LATEST=%%~fI"
findstr /I /R /C:"%string%" "%LATEST%"
答案 1 :(得分:0)
...
FOR /F "delims=" %%I IN ('DIR %log_path%*.* /A:-D /O:-D /B') do (
findstr /I /L /C:"%string%" "%log_path%%%I"
goto done
)
echo none found!
:done
dir
仅以反转日期顺序生成文件NAMES,因此第一个文件是最新的。此名称已分配给%%I
然后findstr
将在文件中找到所需的字符串,作为LITERAL(/L
);需要从目录中汇编名称,因为/B
命令上的dir
开关仅提供名称。加上引号以允许目标路径包含分隔符。
就个人而言,我从路径名中省略了结束\
并在必要时插入它们。由于您已在变量中包含终端\
,因此您的代码会将两个\
串在一起。
答案 2 :(得分:0)
其他答案已经显示了如何在目录(dir
,for /F
)中找到最新(上次修改过的)文件:
set "string=Error"
set "log_path=C:\path\Log"
for /F "delims= eol=|" %%F in ('
dir /B /A:-D /O:D "%log_path%\*.*"
') do (
set "latest=%%F"
)
findstr /I /R /C:"\<%string%\>" "%log_path%\%latest%"
findstr
命令行以不区分大小写的方式(Error
)返回包含单词/I
的所有行。搜索字符串中的\<
和\>
表示字边界,因此搜索字符串必须是单个字,因此字符串Errors
不构成匹配。这仅适用于正则表达式搜索(/R
),这意味着您必须转义某些元字符,例如.
,*
,^
,{{1您的搜索字符串中的{}},$
,[
和]
位于\
前面,以字面形式对待。
如果您希望\
构成匹配项,请移除Errors
或将其替换为/R
以强制进行文字搜索。
如果您想将/L
的输出写入文件,请使用redirection:
findstr