2010-03-11 123 views
4

我有一个Windows批处理文件,用于处理给定目录中的所有文件。我有206783页的文件,我需要处理:如何解决批处理文件处理限制

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个文件吗?

我在Windows 2003服务器企业版32位上运行。


UPDATE

它看起来像我的问题的根本原因是与ZIP文件,内置的Windows“提取”命令。

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

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

+0

什么'program.exe'办?它是内部开发的吗?或者你下载的一些第三方工具? 'program.exe'可以带参数,例如'program.exe * .xml'?你的输出真的必须是每个输入文件1个文件吗? – ghostdog74 2010-03-11 14:52:40

+0

@ ghostdog74; program.exe是内部开发的,不幸的是它一次只能处理1个文件(我在QA中工作,所以我在程序的设计中没有多少发言权)。程序目前的设计方式是每个输入文件创建1个输出文件。 – 2010-03-11 15:03:00

+0

这可能是学习PowerShell的时候了。你似乎在16位计算的日子里受到了限制,这应该不会令人惊讶。 – 2010-03-11 21:09:25

回答

3

另一种选择可能是在文件的输出迭代的dir,而不是直接。我通常讨厌它的人做到这一点的时候,但显然有限制标准迭代成语。

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

我目前正在尝试,但可能需要一段时间;刚刚填满了一个包含100k个文件的目录。

但是请记住,使用命令的输出,如果你使用光栅字体与Unicode的问题,所以请确保您的控制台窗口有龙力控制台或另一种TrueType字体集。否则,Unicode字符会在当前代码页中解析为问号或与它们最接近的等价物 - 但程序将不会找到该文件。

ETA:这不可能是问题,显然。无论你的代码和我的测试代码迭代dir输出过程300K的文件在Windows服务器2K3 R2,32位和Windows 7

+1

+1:我有相同的想法,并测试了一些300K文件。按预期工作。 – 2010-03-11 15:49:11

+1

如果您将'DIR'命令的输出写入文件,然后处理其内容,则会获得更好的性能。 – 2010-03-11 15:52:51

+0

@Frank和@Johannes;你是对的。事实证明,根本原因是ZIP文件内置Windows“提取”命令的问题。我必须处理的文件在ZIP文件中;我的服务器没有安装ZIP实用程序,只是本机Windows命令。显然“全部提取”仅提取前65,535个文件。我安装了7-zip,解压缩了所有文件,并且我的批处理脚本按预期工作。 – 2010-03-11 20:58:22

0
  1. 如果是的Program.exe在建的,你可以 重构它采取的参数,以便 您可以为 循环
  2. 就可以输出文件存储你进入 不同的目录,而不是废除了 创建到同一个目录下
  3. 你可以将你的输出组合成 类别,这样你就可以减少输出 文件来处理。
+0

边注1:程序应该接受在这种情况下,通配符,而不仅仅是文件名(这将结束甚至更早,由于8190字符数限制在批处理文件中的命令行)的列表。 – Joey 2010-03-11 15:32:16

0

两个选项:

1)我建议你到.exe文件处理之后,添加一个“移动”,让您的批处理文件可以被重新启动,它会处理仅仍然在文件原始目录。无论实际的大小限制如何,这都是一个好主意,所以你不必担心在批次中断或掉电等情况下必须重新处理内容。

2)使用另一种脚本语言,如Windows Perl口译员,或者可能是WSH