Memory 循环的批处理内存泄漏?

Memory 循环的批处理内存泄漏?,memory,memory-leaks,batch-file,for-loop,Memory,Memory Leaks,Batch File,For Loop,我正在编写一个批处理脚本,它遍历目录中的每个文件,查找代码文件并以某种方式修改它们。在我完成任务后,我试着在一个包含6000个文件的大目录下运行它。大约40分钟的脚本崩溃了,我从命令提示符得到了很多内存不足的错误,在运行脚本的同时查看任务管理器显示,我的程序以每次循环迭代1MB的速度消耗内存。因此,我很自然地认为我做错了什么,于是删掉了我为隔离问题而编写的所有代码。但是,除了for循环之外,我还有一个空文件,问题仍然存在 下面是我在一个相当大的目录上运行的内容,如我所说: @echo off s

我正在编写一个批处理脚本,它遍历目录中的每个文件,查找代码文件并以某种方式修改它们。在我完成任务后,我试着在一个包含6000个文件的大目录下运行它。大约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中编写脚本

问题在于CMD.EXE和COMMAND.COM留出了特定数量的内存供使用。通常,在使用批处理文件进行大量处理时,需要增加脚本可以使用的内存工作负载

根据您正在运行的操作系统环境,您可以执行以下操作:

WINDOWS NT/2000/XP:您可以更改 COMMAND.COM环境内存 /e开关,例如:

command.com /e:2048 /c BatchFile.BAT
将在具有 2048字节环境内存


WINDOWS 95/98/ME:您可以更改 环境内存分配在 特定MS-DOS窗口或 特定批处理文件的快捷方式。 打开属性对话框 (右键单击快捷方式或桌面。) 图标,然后单击属性)。 单击内存选项卡。使用首字母 环境下拉框,用于设置 足够容纳变量的大小, 比如2048字节(如果您愿意,可以更多)


为了安全起见,我还应该增加您的磁盘内存使用量。

似乎
for/R
会消耗内部文件列表的内存。如果从驱动器根目录运行,它将显示内存消耗,因为驱动器根目录基本上递归地具有相当多的文件

这一个显示了更大的消耗:

@echo off

call :OUT_OF_MEMORY ^^
exit /b

:OUT_OF_MEMORY
call set __DUMMY=%%1
自行承担使用风险,这是不可阻挡的。:)


PS:在Windows 7上复制

pushd命令后的popd点是什么?这对我来说毫无意义。你将一事无成(只是在两个目录之间来回移动)。我正在模拟我的实际代码。在完整的文件中,推送和弹出之间有很多内容。好的,我想你应该添加。。。没有显示代码的地方。哦,我误解了你问题的那部分。我只是想把代码简化到仍然存在漏洞的最小块。如果您愿意,可以添加echo!currentDir!在推动和流行之间。这基本上就是我们正在做的。