代码之家  ›  专栏  ›  技术社区  ›  Patrick Cuff

如何绕过批处理文件的限制

  •  4
  • Patrick Cuff  · 技术社区  · 14 年前

    我有一个处理给定目录中所有文件的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 它报告存在65535个文件。

    所以,看起来我的命令环境对它能识别的文件数量有一个硬限制,这个限制是64K-1。

    1. 有没有办法扩展命令环境来管理64K-1以上的文件?
    2. 如果没有,vbscript或javascript是否能够处理所有206783文件?

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


    更新

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

    我必须处理的文件是通过一个zip文件从另一个系统复制的。我的服务器没有安装zip实用程序,只是安装了本机Windows命令。我用鼠标右键点击了压缩文件,然后做了一个“全部解压…”,这显然只是解压了前65535个文件。

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

    3 回复  |  直到 14 年前
        1
  •  3
  •   Joey    14 年前

    另一个选项可能是迭代 dir 而不是直接覆盖文件。我通常讨厌别人这样做,但很明显 标准迭代习语的限制。

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

    我目前正在尝试这个方法,但可能需要一段时间;只是在一个目录中填入了100K个文件。

    但是请记住,如果您使用的是光栅字体,那么使用命令的输出会出现Unicode问题,因此请确保您的控制台窗口设置了Lucida控制台或其他TrueType字体。否则,Unicode字符会在当前代码页中被解析为问号或其最接近的等效字符,但程序将找不到该文件。

    埃塔: 显然,这不是问题所在。你的代码和我的测试代码 迪尔 输出Windows Server 2K3 R2、32位和Windows 7上的300k文件。

        2
  •  0
  •   ghostdog74    14 年前
    1. 如果Program.exe是内置的,则可以 重构它以接受参数,因此 你可以为了 环
    2. 您可以将输出文件存储到 不同的目录而不是 在同一目录中创建
    3. 您可以将输出分组为 类别,因此输出量较小 要处理的文件。
        3
  •  0
  •   p.marino    14 年前

    两种选择:

    1)我建议您在.exe处理后添加一个“move”,这样您的批处理文件就可以重新启动,它只处理仍在原始目录中的文件。这是一个好主意,不管实际的大小限制,所以你不必冒险重新处理的东西,以防你的批中断或断电等。

    2)使用另一种脚本语言,如Windows Perl解释器,或者 WSH .