Windows批处理文件末尾的简单插入符号(^)会占用所有内存

这个简单的批处理文件按照相对较短的顺序使用Windows 7(x64)上的所有可用内存。 这是怎么回事? 并采取什么预防措施来防范它?

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

显然必要的前提条件:

  • 脱字号^是文件中最后一个东西,脚本不会以换行符终止
  • 脱字符前面至少有2个空格或字符,例如,如果下面的点代表空格,内存泄漏将不会被触发.^ ,而这一个将会..^ (只是缓慢地)
  • 在这个Process Explorer屏幕截图中,脚本运行了大约30秒,耗用了2.9GB,并且仍在以稳定的速度攀升:

    2.9GB内存消耗并仍在攀升

    如果你要试验这个,确保你可以进入关闭窗口[X]控制,或者启动一个任务管理器或进程管理器并准备好,因为Ctrl-C,Ctrl-Break,Alt-F4 没有任何作用

    看起来多个插入符号会导致内存使用速度加快得更快。 我第一次遇到这种情况时,在1到2分钟内没有足够的内存来完成像Alt-Tab这样的简单事情,甚至3个手指向上按下Ctrl-Alt-Del也无效。 我不得不关机。


    思考

    这个原因(根据我的理解)是由于cmd解释器寻找一个字符以逃避,因为^是批转义字符。 在这种情况下,不要正确地标识文件eof的结尾,cmd只是在查找要转义的字符时保持循环和初始化。

    在Windows 8 Pro(64)上用cc^^^ (多克拉用于加速泄漏)转载。

    试验

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

    cc^^与正常的无效命令错误一起崩溃。

    cc^^^无限循环并且泄漏速度更快。

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

    cc ^^与正常的无效命令错误一起崩溃。

    cc ^^^无限循环并且泄漏速度更快。

    cc"^崩溃,正常的无效命令错误。

    cc"^^崩溃,正常的无效命令错误。

    cc"^^^与正常的无效命令错误一起崩溃。

    笔记

  • 只有无限循环和泄漏时克拉^字面上使用(报价的外侧)。 当引用添加脚本崩溃时出现标准无效命令错误。
  • 批处理文件编码为UTF-8ASCII时,只有无限循环和泄漏。 当UTF-16时 ,脚本会因标准的无效命令错误而崩溃。
  • 必须是一个奇数克拉,以避免最后的克拉。
  • 注意事项

  • 确保没有批处理脚本以carat ^ (0x5E)或至少奇数个克拉结束。
  • 或者用UTF-16编码它们。
  • 链接地址: http://www.djcxy.com/p/92289.html

    上一篇: Simple caret (^) at end of Windows batch file consumes all memory

    下一篇: How to track untracked content?