Batch file FINDSTR-添加“文件”;“修改日期”;将文件的名称作为每个结果的前缀

Batch file FINDSTR-添加“文件”;“修改日期”;将文件的名称作为每个结果的前缀,batch-file,cmd,findstr,Batch File,Cmd,Findstr,我正在寻找一些命令添加到我的脚本中。 脚本将遍历文本日志文件文件夹并查找作为输入传递的字符串。 不幸的是,日志文件以设置的大小溢出,文件名中没有日期,只有数字后缀和字符串前缀。在日志文件行中,只有事件的时间,而不是日期。日期被添加为12点钟的单行 完成搜索的文件夹示例: 日志文件_001.txt 日志文件_002.txt 重新启动-01_日志文件_001.txt 重新启动-01_日志文件_002.txt 重新启动-01_日志文件_003.txt 重新启动-02_日志文件_001.txt 重新启动

我正在寻找一些命令添加到我的脚本中。 脚本将遍历文本日志文件文件夹并查找作为输入传递的字符串。
不幸的是,日志文件以设置的大小溢出,文件名中没有日期,只有数字后缀和字符串前缀。在日志文件行中,只有事件的时间,而不是日期。日期被添加为12点钟的单行

完成搜索的文件夹示例:

日志文件_001.txt
日志文件_002.txt
重新启动-01_日志文件_001.txt
重新启动-01_日志文件_002.txt
重新启动-01_日志文件_003.txt
重新启动-02_日志文件_001.txt
重新启动-02_日志文件_002.txt

我想在FINDSTR结果的每一行中添加搜索文件的“date modified”属性。

我当前的代码:

@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
当前结果:

Reboot-79_Logfile_001.txt:08:29:05.586 loginfo
Reboot-79_Logfile_001.txt:08:30:05.586 loginfo

通缉结果:

2019/08/13重新启动-79_日志文件_001.txt:08:29:05.586登录信息
2019/08/13重新启动-79_日志文件_001.txt:08:30:05.586登录信息

或:

Reboot-79_Logfile_001.txt:2019/08/13 08:29:05.586 loginfo
Reboot-79_Logfile_001.txt:2019/08/13 08:30:05.586 loginfo


其中“2019/08/13”是文件Reboot-79_Logfile_001.txt的“date modified”属性的日期,我不得不做一个小改动,因为我最初在火车上的手机上写下了这个,并且我在测试时出现了一些拼写错误等

特别是这两个单字符更改:

“令牌=1*
不是
”令牌=1*

SET“\u DateMatched=1”
NOT
SET“\u DateMatched=“

为此,使用循环从find string的结果中分离出文件名,然后从中获取要在echo中使用的日期

剧本 结果 此外,是的,你可以用一个FOR/F来代替。这是一个50/50的硬币翻转II didd,使用定义/未定义的FOR循环来代替FOR/F循环

然而,提供的另一个答案选择了这条路径,但出于某种原因,使用我的代码作为基础,并添加到第三个循环中,因此中间的循环是多余的

我会在这里发布这个备选方案,就像我曾经想过的那样,两种方式都会发布,一种方式是六个半打,另一种方式是六个半打。(但我不会把你的时间浪费在一个额外的循环上,我仍然在用我的大脑围绕着它们添加它!)

替代版本 虽然每种方法在功能上并没有什么不同,但我对第一种还是第二种方法在审美上是否更令人愉悦犹豫不决,因此,对我来说,先写哪一种方法,还是两种方法都写,这是一个掷硬币的问题

也就是说,我试图为我收到的一些奇怪的评论创建一个rational,因为我的代码发布了一些基本上非功能性的小改动,但代码的核心仍然是我编写的东西,只是选择了显示for/F方法,但这样做的方式会造成不必要的第三次循环

我认为
FOR/F
有一些小的好处,它节省了大约50个字符的代码,虽然在这种情况下它实际上是50/50,但在某些情况下,我肯定会选择它作为下一步的速度稍微快一点,尽管在这种情况下,我们在一场比赛中只有3次迭代,因此,我怀疑在目前的情况下,我们需要进行10到数千场比赛,才能明显影响结果


这就是说,通过添加第三个不必要的循环,就像在其他评论中一样,我怀疑任何速度优势都是无效的,所以。。我不确定,至少在我提供的上述代码中没有不必要的循环,因此如果有速度优势音乐会,请尝试使用它

@OP最初我在火车上的手机上写下这篇文章时,我不得不做一个小改动,而且我还做了一些拼写错误等,这些都是你测试时出现的

特别是这两个单字符更改:

“令牌=1*
不是
”令牌=1*

SET“\u DateMatched=1”
NOT
SET“\u DateMatched=“

为此,使用循环从find string的结果中分离出文件名,然后从中获取要在echo中使用的日期

剧本 结果 此外,是的,你可以用一个FOR/F来代替。这是一个50/50的硬币翻转II didd,使用定义/未定义的FOR循环来代替FOR/F循环

然而,提供的另一个答案选择了这条路径,但出于某种原因,使用我的代码作为基础,并添加到第三个循环中,因此中间的循环是多余的

我会在这里发布这个备选方案,就像我曾经想过的那样,两种方式都会发布,一种方式是六个半打,另一种方式是六个半打。(但我不会把你的时间浪费在一个额外的循环上,我仍然在用我的大脑围绕着它们添加它!)

替代版本 虽然每种方法在功能上并没有什么不同,但我对第一种还是第二种方法在审美上是否更令人愉悦犹豫不决,因此,对我来说,先写哪一种方法,还是两种方法都写,这是一个掷硬币的问题

也就是说,我试图为我收到的一些奇怪的评论创建一个rational,因为我的代码发布了一些基本上非功能性的小改动,但代码的核心仍然是我编写的东西,只是选择了显示for/F方法,但这样做的方式会造成不必要的第三次循环

我认为
FOR/F
有一些小的好处,它节省了大约50个字符的代码,虽然在这种情况下它实际上是50/50,但在某些情况下,我肯定会选择它作为下一步的速度稍微快一点,尽管在这种情况下,我们在一场比赛中只有3次迭代,因此,我怀疑在目前的情况下,我们需要进行10到数千场比赛,才能明显影响结果

这就是说,通过添加第三个不需要的循环,如o
@(
  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
@(
  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%"
  )
)
:: 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
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
        )
    }
@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" ^
            ")" ^
        "}"