是什么减慢了我的批处理文件的速度?

2024-03-05

稍微处理一下批处理文件,并想知道为什么在以下场景中输出文件所需的时间存在巨大差异:

场景 1:简单遍历日志文件,并且对于每一行,始终采用第 5 个标记,除非它包含过滤字符串。

(for /f "tokens=5" %%a in (test.log) do @echo(%%a) |  findstr /v "filter_1 filter_2" > !filter!.txt

这非常有效,浏览 50M 文件会在 10 秒内返回一个较小的 10Mb 文件。

场景 2:执行完全相同的操作,但在标记的前面和末尾添加一些内容,以便我可以输出为 xml 文件而不是文本文件。为此,我必须按如下方式重建它

echo ^<rows^> > test.xml

>>test.xml (
for /f "tokens=5" %%a in (
    'findstr /v "filter1 filter2" test.log'
    ) do echo ^<r a="%%a"/^> 
)

echo ^</rows^> >> test.xml

对于小文件它可以按预期工作,但对于大文件则需要永远。无论如何,有没有办法通过场景 2 实现我想要的效果,但使用场景 1 语法,因为这似乎更有效。


FOR /F 始终在开始任何迭代之前缓冲 IN() 子句的内容。对于读取文件以及处理命令的输出都是如此。然而,我相信命令输出的缓冲方式存在一些根本性的差异,这使得它在大输出时特别慢。Edit:MC ND 有一个很好的解释为什么大输出的缓冲这么慢 https://stackoverflow.com/a/23374733/1012053.

大多数人惊讶地发现,有时最快的批处理解决方案是将命令输出写入临时文件,然后使用 FOR /F 读取临时文件。只要您的磁盘驱动器速度很快,这就会很快。

我相信以下内容将大大加快速度:

findstr /v "filter1 filter2" test.log >test.log.mod
>test.xml (
  echo ^<rows^>
  for /f "tokens=5" %%A in (test.log.mod) do echo ^<r a="%%A"/^>
  echo ^</rows^>
)
del test.log.mod

另一种选择是将 XML 包装器添加到原始管道的左侧,然后适当地修改 FINDSTR 过滤器。但上述解决方案可能仍然更快,具体取决于过滤掉的行数。

(
  echo ^<rows^>
  for /f "tokens=5" %%A in (test.log) do echo ^<r a="%%A"/^>
  echo ^</rows^>
) | findstr /v /c:"modifiedFilter_1" /c:"modifiedFilter_2" > test.xml

FINDSTR 还需要/R如果过滤器是正则表达式,则选项。

但更快的解决方案是使用 Windows 的 sed 之类的工具,或者 JScript/Batch 混合实用程序、我的 REPL.BAT 或 Aacini 的 FINDREPL.BAT。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么减慢了我的批处理文件的速度? 的相关文章

  • 如何为批量角色扮演游戏创建保存/加载命令?

    我正在制作一个基于文本的批量角色扮演游戏 RPG 最近才开始学习 我的 RPG 没有生命值之类的东西 它更像是故事类型的 RPG 基本上 你选择你想做的选项 然后继续故事 每个选项都可以改变结局 所以 我想知道是否有办法保存 RPG 中的
  • 如何运行 .bat 文件而不弹出 cmd 窗口?

    我有一个 bat 文件 我正在尝试在 Jenkins 中运行 Jenkins 作为服务运行 因此不会识别弹出窗口 有没有办法以静默模式运行这个 bat 文件 或者不允许弹出 cmd 窗口 那么你可以使用start命令与 min and b切
  • Windows批处理文件-显示所有子文件夹

    我在使用 Windows 批处理文件返回 JUST 文件夹 忽略文件 时遇到困难 这就是我现在所拥有的 目前它正在返回文件和子子文件夹 for r g in xx do echo g 另外 假设我只想返回以几个不同前缀开头的文件夹 例如 我
  • 在正确的时机批量创建视频 .srt 字幕

    好家伙 我什至不知道从什么开始 所以 我有一个包含很多视频的文件夹 我需要的是使用这些视频的名称创建字幕 同时注意其长度以创建 srt 格式的字幕 我已经查找了一些信息并复制了一些代码 echo off set dirpath 1 dir
  • 根据文件内容重命名文件批处理文件

    我需要一个批处理文件来读取 XYZ txt 文件中存在的描述名称 并根据描述名称重命名该文件名 例如 我有一个名为 nest txt 的文件名 当我们打开文本文件 nest txt 时 文件名的第二行有说明 Description Man
  • 从 IPConfig 获取 IP 地址,稍后在代码中使用,或保存 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否可以运
  • Windows批量编程中读取文件名

    我想在Windows批处理编程中读取文件的名称 我尝试使用不同的方法但失败了请帮助 下面给出了场景 我的文件夹中有不同的文件 但所有文件的文件名长度相同 例如 1000342578 30062011 PDF 1000342329 30062
  • 批处理文件中的 Powershell - 如何转义元字符?

    运行 Windows 7 当我复制文件在例程期间到外部磁盘文件备份 我使用 Powershell v2 从批处理文件 在副本文件上重新创建原始文件的所有时间戳 以下代码在大多数情况下都能成功运行 但并非总是如此 SET file 1 SET
  • 读取txt文件中的每一行并使用windows dos命令分配变量

    我通过使用 Beyond Compare 命令行比较这 2 个文件夹 将文件从一个路径复制到 svn 工作副本 使用 Beyond Compare 进行比较后将生成报告 如果右侧存在任何额外文件 则应从 svn 存储库中删除 所以我使用下面
  • 如何使用 Windows forfiles 命令的完整路径运行命令?

    我正在尝试运行以下命令 forfiles p Schemas m xsd c cmd c C Program Files x86 Microsoft SDKs Windows v10 0A bin NETFX 4 6 1 Tools xsd
  • 如何在批处理文件中测试当前驱动器号?

    我正在尝试编写一个批处理文件 该文件获取运行批处理文件的驱动器号 并使用它的 IF 语句 例如如果字母是M 则会跳转到标签 mSection 这可能吗 您可以使用 d0 来获取驱动器号 像这样的东西 IF d0 M CALL mSectio
  • 批处理 - 默认浏览器?

    有没有办法使用批处理文件查找我的计算机上的默认浏览器 只需使用 启动 www google com See here http social msdn microsoft com Forums is iewebdevelopment thr
  • 午夜后时间设置不正确

    我使用以下命令以更易读的格式获取当前日期 时间 set day date 4 2 set mth date 7 2 set yr date 10 4 set hur time 0 2 set min time 3 2 set bdate d
  • 为什么 Windows 批处理文件“exit”不能与“||”一起使用?

    批处理 命令脚本中的通常建议是使用exit b设置时退出ERRORLEVEL来指示错误 然而这与 CMD 的配合不太好 and 运营商 如果我在 CMD 命令行运行这些 C gt echo exit b 1 gt foo cmd C gt
  • 如何从 HTA 中启动批处理文件

    我有一个基本的 HTA 其中我尝试通过按钮启动批处理文件 但是当我尝试启动批处理文件时 它不会运行 当我按下按钮时 将启动命令提示符窗口 但不会运行脚本 这是代码的简单示例
  • 比较批处理文件中的两个数字

    我在这个网站上搜索了我的问题 但没有找到解决我问题的方法 系统为玩家和计算机提供一个从 2 到 12 的随机数 这有 3 部分 X 大于 Y 如果 X 小于 Y 以及当 X 与 Y 相同 当我开始 bat 效果很好 我选择Play Game
  • 如何设置任务在使用 vbs 登录时以当前用户身份运行而无需管理员权限?

    从命令行 我可以创建一个在登录时运行的计划任务 无需管理员权限或用户输入密码来设置任务 但是我必须使用 xml 文件来执行此操作 下面是一个示例 xml 其中 Domain User 部分必须在运行时替换为当前用户的域和名称
  • 使用参数将变量从 vbscript 传递到批处理文件

    请问如何将 inp 变量从这段 vb 传递到我的名为 job bat 的批处理 确实 在从 job bat 进行回显 echo 2 时 我注意到 inp 未正确传递 提示命令视图 inp而不是从 vbs 检索到的值 谢谢 For Each
  • 如何批量获取子字符串在字符串中的位置

    获取子串的位置 Set str1 This is Test string Set sstr Test 这里我需要获取 Test 8 的位置 谢谢 echo OFF SETLOCAL Set str1 This is Test string
  • “以管理员身份运行”时的 Windows 批处理文件起始目录

    我有一个位于目录中的批处理文件 也必须从那里运行 因为它会更新该目录中的文件 这工作得很好 除非用户以管理员身份运行批处理文件 Vista 上需要 那么起始目录是C Windows System32 有什么办法仍然能够知道批处理文件是从哪个

随机推荐