首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FINDSTR -添加文件的“修改日期”作为每个结果的前缀

FINDSTR -添加文件的“修改日期”作为每个结果的前缀
EN

Stack Overflow用户
提问于 2019-08-13 09:54:36
回答 4查看 1.8K关注 0票数 1

我正在寻找一些命令来添加到我的脚本中。该脚本遍历一个文本日志文件文件夹,并查找作为输入传递的字符串。

不幸的是,日志文件以设置的大小溢出,文件名中没有日期,只有一个数字后缀和一个字符串前缀。在日志文件行中,只有事件的时间,而不是日期。这个日期在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结果的每一行中添加搜索文件的“日期修改”属性.

我现在的代码是:

代码语言:javascript
复制
@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的”日期修改“属性的日期。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-08-13 13:04:44

@OP,当我在火车上的手机上写这篇文章的时候,我不得不做一个小小的改动,我做了几个你测试的时候出现的打字。

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

"Tokens=1*而非"Token=1*

SET "_DateMatched=1"而非SET "_DateMatched="

为此,使用循环从find字符串的结果中拆分出文件名,然后获取回显中要使用的日期。

脚本

代码语言:javascript
复制
@(
  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="
)

结果

代码语言:javascript
复制
Searching for ggg 
--------------------------------------------- 
 08/13/2019 test.txt:ggg
 08/13/2019 test2.txt:ggg

此外,是的,您可以使用一个FOR /F而不是一个50/50的硬币翻转II didd来使用定义/未定义的FOR循环而不是FOR /F循环。

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

我会在这里发布这个选项,就像我曾经考虑过的那样,这是六种方式,六种方式,另一种。(但我不会把你的时间浪费在一个额外的循环上,我仍然把我的大脑围绕在它们周围,再加上这一点!)

替代版本

代码语言:javascript
复制
@(
  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的数千个匹配,然后才能明显地影响结果。

尽管如此,通过添加第三个不必要的循环,就像在另一个评论中一样,我怀疑任何速度效益都被取消了,所以..。我不确定,至少在上面的代码中,如果没有不需要的循环,那么如果有速度效益音乐会,尝试使用它。:)

票数 0
EN

Stack Overflow用户

发布于 2019-08-13 14:16:05

若要而不是插入文件时间,则需要另一个用于删除它的文件。

代码语言:javascript
复制
:: 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"

样本输出:

代码语言:javascript
复制
> 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

票数 0
EN

Stack Overflow用户

发布于 2019-08-13 16:54:36

这是一个得到你想要的东西的方法。

=== grepplus.ps1

代码语言:javascript
复制
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

代码语言:javascript
复制
@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" ^
            ")" ^
        "}"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57475301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档