我正在寻找一些命令来添加到我的脚本中。该脚本遍历一个文本日志文件文件夹,并查找作为输入传递的字符串。
不幸的是,日志文件以设置的大小溢出,文件名中没有日期,只有一个数字后缀和一个字符串前缀。在日志文件行中,只有事件的时间,而不是日期。这个日期在12点加为一行。
完成搜索的文件文件夹示例:
Logfile_001.txt Logfile_002.txt 重新引导-01_Logfile_001.txt 重新引导-01_Logfile_002.txt 重新引导-01_Logfile_003.txt 重启-02_Logfile_001.txt 重启-02_Logfile_002.txt
我想在FINDSTR结果的每一行中添加搜索文件的“日期修改”属性.
我现在的代码是:
@ECHO off
DEL /F _Result.searchresult
SET /P searchterm=Enter search term:
@ECHO Searching for %searchterm% >_Result.searchresult
@ECHO --------------------------------------------- >>_Result.searchresult
FINDSTR /S /C:"%searchterm%" *.txt >>_Result.searchresult
_Result.searchresult目前的结果:
重启-79_Logfile_001.txt:08:29:05.586 重启-79_Logfile_001.txt:08:30:05.586
通缉结果:
2019/08/13重新引导-79_Logfile_001.txt:08:29:05.586 2019/08/13重新引导-79_Logfile_001.txt:08:30:05.586
或者:
重启-79_Logfile_001.txt:2019/08/13 08:29:05.586 loginfo 重启-79_Logfile_001.txt:2019/08/13 08:30:05.586 loginfo
其中"2019/08/13“是文件Reboot-79_Logfile_001.txt的”日期修改“属性的日期。
发布于 2019-08-13 13:04:44
@OP,当我在火车上的手机上写这篇文章的时候,我不得不做一个小小的改动,我做了几个你测试的时候出现的打字。
,特别是这两个单个字符的更改:
"Tokens=1*而非"Token=1*
和
SET "_DateMatched=1"而非SET "_DateMatched="
为此,使用循环从find字符串的结果中拆分出文件名,然后获取回显中要使用的日期。
脚本
@(
SETLOCAL
ECHO OFF
SET "_ResultFile=_Result.searchresult"
SET "_DateMatched="
)
DEL /F /Q "%_ResultFile%"
SET /P "_SearchTerm=Enter search term: "
ECHO Searching for %_SearchTerm% >"%_ResultFile%"
ECHO --------------------------------------------- >>"%_ResultFile%"
FOR /F "Tokens=1* delims=:" %%A IN ('
FINDSTR /S /C:"%_SearchTerm%" *.txt
') DO (
For %%a in ( %%~tA ) Do (
IF NOT DEFINED _DateMatched (
ECHO.%%a %%A:%%B>>"%_ResultFile%"
SET "_DateMatched=1"
)
)
SET "_DateMatched="
)结果
Searching for ggg
---------------------------------------------
08/13/2019 test.txt:ggg
08/13/2019 test2.txt:ggg此外,是的,您可以使用一个FOR /F而不是一个50/50的硬币翻转II didd来使用定义/未定义的FOR循环而不是FOR /F循环。
然而,提供的另一个答案选择了这条路径,但出于某种原因,使用我的代码作为基础,并添加到第三个循环中,因此它们的中间循环是多余的。
我会在这里发布这个选项,就像我曾经考虑过的那样,这是六种方式,六种方式,另一种。(但我不会把你的时间浪费在一个额外的循环上,我仍然把我的大脑围绕在它们周围,再加上这一点!)
替代版本
@(
SETLOCAL
ECHO OFF
SET "_ResultFile=_Result.searchresult"
)
DEL /F /Q "%_ResultFile%"
SET /P "_SearchTerm=Enter search term: "
ECHO Searching for %_SearchTerm% >"%_ResultFile%"
ECHO --------------------------------------------- >>"%_ResultFile%"
FOR /F "Tokens=1* delims=:" %%A IN ('
FINDSTR /S /C:"%_SearchTerm%" *.txt
') DO (
For /F %%a in ("%%~tA") Do (
ECHO.%%a %%A:%%B>>"%_ResultFile%"
)
)虽然这两种方法在功能上并没有什么区别,但我只想说明第一种还是第二种方法是否更美观,所以对我来说,这是一种硬币翻转,可以先写,还是两者都写。
这就是说,试图为我收到的一些奇怪的评论创建一个rational,另一个评论是因为我发布了一些本质上是非功能性的小改动,但是代码的核心仍然是我编写的东西,只是选择了显示for /F方法,但是这样做的方式是不必要的第三个循环。
我认为FOR /F有一些小的好处,它节省了大约50个字符的代码,而在这种情况下,实际上是50/ 50,但在某些情况下,我肯定会选择它作为下一步的速度,尽管在这种情况下,一次匹配只有3次迭代,所以我怀疑在当前的场景中,我们需要有10s的数千个匹配,然后才能明显地影响结果。
尽管如此,通过添加第三个不必要的循环,就像在另一个评论中一样,我怀疑任何速度效益都被取消了,所以..。我不确定,至少在上面的代码中,如果没有不需要的循环,那么如果有速度效益音乐会,尝试使用它。:)
发布于 2019-08-13 14:16:05
若要而不是插入文件时间,则需要另一个用于删除它的文件。
:: Q:\Test\2019\08\13\SO_57475301.cmd
@ECHO OFF
SET /P "_searchterm=Enter search term: "
(ECHO Searching for %_searchterm%
ECHO ---------------------------------------------
FOR /F "tokens=1* delims=:" %%A IN ('
FINDSTR /C:"%_searchterm%" *.txt
') DO For %%a in ("%%A") Do For /F %%D in ("%%~ta") do ECHO:%%D %%A:%%B
) >"_Result.searchresult"样本输出:
> SO_57475301.cmd
Enter search term: log
> type _Result.searchresult
Searching for log
---------------------------------------------
08/13/2019 Reboot-79_Logfile_001.txt:08:29:05.586 loginfo
08/13/2019 Reboot-79_Logfile_001.txt:08:30:05.586 loginfo让文件名第一次重新排序ECHO:%%A:%%D %%B
发布于 2019-08-13 16:54:36
这是一个得到你想要的东西的方法。
=== grepplus.ps1
Get-ChildItem -File -Path 'C:/src/t' -Filter '*.ps1' |
Select-String '^S' |
ForEach-Object {
'{0} {1}:{2}' -f (
(((Get-ChildItem $_.Path).LastWriteTime).ToString('yyyy/MM/dd') -replace '-','/'),
$_.Filename,
$_.Line
)
}=== grepplus.bat
@ECHO OFF
powershell -NoLogo -NoProfile -Command ^
"Get-ChildItem -File -Path 'C:/src/t' -Filter '*.ps1' |" ^
"Select-String '^S' |" ^
"ForEach-Object {" ^
"'{0} {1}:{2}' -f (" ^
"(((Get-ChildItem $_.Path).LastWriteTime).ToString('yyyy/MM/dd') -replace '-','/')," ^
"$_.Filename," ^
"$_.Line" ^
")" ^
"}"https://stackoverflow.com/questions/57475301
复制相似问题