提高 Windows 的批处理脚本性能

Improve Windows's batch script performance

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

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

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

在您发布的命令行中,最慢的部分可能是 findstrsort 和 cmd 的管道管理。

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

  • sort 在你的命令行中除了改变你处理文件的顺序什么都不做,但是要这样做,它需要将整个文件列表读入内存并且 运行 对它们的排序算法。除非您有特定原因,文件必须按 directory/filename 的字母顺序处理,否则我将跳过此步骤。

  • 使用 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 等工具来衡量您的表现,而不是仅仅接受网站上某个人的话。