【问题标题】:Simple caret (^) at end of Windows batch file consumes all memoryWindows 批处理文件末尾的简单插入符号 (^) 会消耗所有内存
【发布时间】:2013-03-06 04:02:08
【问题描述】:

这个简单的批处理文件以相对较短的顺序消耗了 Windows 7 (x64) 上的所有可用内存。这是怎么回事?有哪些预防措施可以预防?

any-invalid-command-you-like-here ^

显示效果的显然必要的先决条件:

  • 插入符号 ^ 是文件中的最后一件事,脚本不会以换行符终止
  • 插入符号前面至少有 2 个空格或字符,例如如果下面的点代表空格,则不会触发内存泄漏.^,而这个会触发..^(只是慢慢地)

在这个 Process Explorer 屏幕截图中,脚本已经运行了大约 30 秒,消耗了 2.9GB,并且还在以稳定的速度攀升:

如果您打算对此进行试验,请确保您可以访问关闭窗口 [X] 控件,或者启动任务管理器或进程资源管理器并准备好 Ctrl-CCtrl-BreakAlt-F4 无效

似乎多个插入符号会导致内存使用量增加得更快。我第一次遇到这种情况时,在 1 或 2 分钟内没有足够的内存来执行简单的操作,例如 Alt-Tab 甚至是三指敬礼 Ctrl-Alt-Del 无效。我不得不硬关闭机器。

【问题讨论】:

  • 不,我收到两条错误消息 (XP):the following string is too longsyntax error(已翻译)。之后脚本终止。
  • 我添加了标签:security,因为它可以被恶意使用,无需大惊小怪,让机器瘫痪。不确定这是否是对该标签的不当使用;如果是,请删除。
  • 我可以想象地球上成千上万的人在同事的机器上运行它,当他们离开它解锁时......只需打开一个 cmd 窗口,执行,最小化窗口然后走开......
  • 在 Windows 10 中修复。

标签: windows security batch-file cmd


【解决方案1】:

想法

原因(据我了解)是由于 cmd 解释器正在寻找要转义的字符,因为 ^ 是批处理转义字符。在这种情况下,cmd 没有正确识别文件 eof 的结尾,而是在寻找要转义的字符时不断循环和初始化一些东西。

在 Windows 8 Pro (64) 上使用cc^^^ 复制(多个插入符号用于加速泄漏)。

试验

cc^ 无限循环并且泄漏非常缓慢。

cc^^ 崩溃并出现正常的无效命令错误。

cc^^^ 无限循环和泄漏更快。

cc ^ 无限循环并且泄漏非常缓慢。

cc ^^ 崩溃并出现正常的无效命令错误。

cc ^^^ 无限循环和泄漏更快。

cc"^ 崩溃并出现正常的无效命令错误。

cc"^^ 崩溃并出现正常的无效命令错误。

cc"^^^ 崩溃并出现正常的无效命令错误。

注意事项

  • 只有在字面上使用插入符号^(在引号之外)时才会出现无限循环和泄漏。添加引用时,脚本会因标准无效命令错误而崩溃。
  • 当批处理文件被编码为 UTF-8ASCII 时,只有无限循环和泄漏。当 UTF-16 时,脚本会因标准无效命令错误而崩溃。
  • 必须是奇数个插入符号,以免漏掉最后一个插入符号。

注意事项

  • 确保没有批处理脚本以插入符号 ^ (0x5E) 或至少奇数个插入符号结尾。
  • 或将它们编码为 UTF-16。

【讨论】:

  • 感谢扩展试用信息和可能的解释。我没想过测试编码。措辞第一个预防措施的另一种方式可能是“总是以空行结尾”,只要我记得,股票 notepad.exe 就已经这样做了。也许这就是为什么;-)
  • @mattwilkie 谢谢,我最喜欢你的预防措辞。 “总是以空行结束” :)
  • 事实证明,这实际上是命令行解析器以及它如何解析批处理文件中的一个错误。更具体地说,逻辑错误;如果插入符号位于 EOF,则真正的 EOF 将被“忽略”并“跳过”,将文件句柄重置为 0,从而重新解析脚本。有关这一切的更多信息,请在此处查看我的详细问题:stackoverflow.com/questions/23284131/…
  • @txtechhelp 这是您的问题的archived version,因为原始问题已被删除。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2019-10-31
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多