我有一个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.
我在Windows 2003服务器上运行,企业版,32位。
更新
看起来我的问题的根本原因是ZIP文件的内置Windows“extract”命令。
我必须处理的文件是通过ZIP文件从另一个系统复制的。我的服务器没有安装ZIP实用程序,只有本机Windows命令。我右键单击了ZIP文件,然后执行了“Extract all ...”,这显然只是提取了前65,535个文件。
我下载并安装了7-zip到我的服务器上,解压缩了所有文件,我的批处理脚本按预期工作。
答案 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)
答案 2 :(得分:0)
两个选项:
1)我建议你在.exe处理之后添加一个“move”,这样你的批处理文件就可以重新启动,它只处理仍在原始目录中的文件。无论实际尺寸限制如何,这都是一个好主意,因此,如果您的批次中断或电源中断等,您不必再重新处理东西。
2)使用其他脚本语言,例如Windows Perl解释器,或者WSH。