如何解决批处理文件的处理限制

时间:2010-03-11 14:44:57

标签: windows batch-file

我有一个Windows批处理文件,用于处理给定目录中的所有文件。我有206,783个文件需要处理:

for %%f in (*.xml) do call :PROCESS %%f
goto :STOP

:PROCESS
:: do something with the file
program.exe %1 > %1.new
set /a COUNTER=%COUNTER%+1
goto :EOF

:STOP
@echo %COUNTER% files processed

运行批处理文件时,会写入以下输出:

  

已处理65535个文件

作为处理的一部分,将为每个处理的文件创建一个输出文件,其扩展名为.new。当我执行dir *.new时,它报告存在65,535个文件。

因此,我的命令环境似乎对它可识别的文件数量有一个硬限制,并且该限制为64K - 1.

  1. 有没有办法扩展命令环境来管理超过64K-1个文件?
  2. 如果没有,VBScript或JavaScript是否能够处理所有206,783个文件?
  3. 我在Windows 2003服务器上运行,企业版,32位。


    更新

    看起来我的问题的根本原因是ZIP文件的内置Windows“extract”命令。

    我必须处理的文件是通过ZIP文件从另一个系统复制的。我的服务器没有安装ZIP实用程序,只有本机Windows命令。我右键单击了ZIP文件,然后执行了“Extract all ...”,这显然只是提取了前65,535个文件。

    我下载并安装了7-zip到我的服务器上,解压缩了所有文件,我的批处理脚本按预期工作。

3 个答案:

答案 0 :(得分:3)

另一种选择可能是迭代dir的输出,而不是直接遍历文件。当人们这样做时,我通常讨厌它,但显然 限制标准迭代习语。

for /f "delims=" %%f in ('dir /b *.xml') do call :PROCESS %%f 

我目前正在尝试这个,但可能需要一段时间;刚用100k文件填充目录。

但请记住,如果您使用的是Raster字体,则使用命令的输出会出现Unicode问题,因此请确保您的控制台窗口具有Lucida控制台或其他TrueType字体集。否则,Unicode字符会被解析为当前代码页中的问号或其最接近的等价物,但程序将无法找到该文件。

ETA:显然,这不是问题。您的代码和我的测试代码都会迭代dir输出,处理Windows Server 2k3 R2,32位和Windows 7上的300k文件。

答案 1 :(得分:0)

  1. 如果program.exe是内置的,你可以 重构它以接受参数 你可以取消for 环
  2. 您可以将输出文件存储到 不同的目录而不是 创建到同一目录
  3. 您可以将输出分组     类别,所以你输出较少     要处理的文件。

答案 2 :(得分:0)

两个选项:

1)我建议你在.exe处理之后添加一个“move”,这样你的批处理文件就可以重新启动,它只处理仍在原始目录中的文件。无论实际尺寸限制如何,这都是一个好主意,因此,如果您的批次中断或电源中断等,您不必再重新处理东西。

2)使用其他脚本语言,例如Windows Perl解释器,或者WSH