我正在编写一个批处理脚本,它遍历目录中的每个文件以查找代码文件并以某种方式修改它们。完成该任务后,我尝试在一个包含大约 6,000 个文件的大目录上运行它。脚本崩溃了大约 40 分钟,我从命令提示符处得到了很多内存不足的错误,在查看任务管理器的同时运行脚本显示我的程序以每次循环迭代大约 1MB 的速度消耗内存。所以很自然地认为我做错了什么,我删掉了我为隔离问题而编写的所有代码。但是后来我得到了一个空文件,除了一个 for 循环,问题仍然存在!
这是我在一个相当大的目录上运行的,就像我说的:
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set directory=%CD%
for /R "%directory%" %%a in (*.c *.cpp *.h *.idl) do (
set currentDir=%%~dpa
pushd !currentDir!
popd
)
我实际上已经能够将其修剪为:
@echo off
for /R "%CD%" %%a in (*) do echo
问题依然存在。
批处理 for 循环中是否存在内存泄漏或者我只是做错了什么?
我运行的是 Windows XP 32 位 Service Pack 2,尽管我已经测试并确认 Service Pack 3 中仍然存在该问题。
最佳答案
这与其说是一个解决方法(或重写)的答案。我已经运行了您的脚本,并且看到了一些内存消耗,其中一些在脚本完成之前不会释放,但是每次迭代我没有得到任何接近 1 MB 的内容。 (就像@aphoria 我可以在 c: 的根目录上运行脚本,在 XP SP3 和 Vista 上没有问题。)
我建议您关闭脚本不需要的任何进程,并一次在一个子目录上运行您的脚本。
如果您无法以任何其他方式解决此问题,我建议您尝试在 Powershell 中编写脚本。
关于批量for循环内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6330519/