【问题标题】:Improve Windows's batch script performance提高 Windows 批处理脚本性能
【发布时间】:2015-12-03 05:33:43
【问题描述】:

我想从文本文件中删除特定的行,使用这个命令:

for /f "delims=" %%d in ('"dir <Dir_Path> /a /b /s | sort"') do type %%d | findstr /V <String_To_Delete>  >  <%%d_Filtered.txt>

它正在工作,但非常非常慢。 如何改进命令或使其在多核中使用?

【问题讨论】:

    标签: windows batch-file command-prompt


    【解决方案1】:

    在你发布的命令行中,最慢的部分大概是findstrsort和cmd的管道管理。

    • findstr 是大热门。它需要读取每个完整的文件,但这是练习的全部原因。如果您不需要正则表达式支持,您可以通过使用文字搜索字符串和/L 参数来禁用正则表达式支持来加快速度。如果可能,请尝试对您的文件列表进行预过滤,以减少 findstr 必须解析的数据量。

    • sort 在您的命令行中只会更改处理文件的顺序,但要这样做,它需要将整个文件列表读入内存并对其运行排序算法。除非您有特定原因,必须按目录/文件名的字母顺序处理文件,否则我会跳过这一步。

    • 通过使用type 读取文件名,然后通过 CMD 管道运行数据,您可能会损失一些性能。让findstr 直接读取文件可能会更快,而不是使用 STDIN。

    使用上面的建议,你的命令行就变成了

    for /f "delims=" %%d in ('"dir <Dir_Path> /a /b /s"') do findstr /V /L [Literal_String] %%d  >  [%%d_Filtered.txt]
    

    请注意,在优化时,您应该始终使用诸如timethis.exe 之类的工具来衡量您的表现,而不是仅仅接受网站上某个人的话。

    【讨论】:

    • 我认为明确告诉findstr 搜索字符串是/R 的正则表达式还是/L 的文字字符串也可能有所帮助;或者在后一种情况下,改为使用find...
    • 谢谢@aschipfl。我包含了 /L 建议。
    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多