windows - 如何绕过批处理文件处理限制

标签 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 files processed

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

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

  1. 有没有办法扩展命令环境以管理超过 64K - 1 个文件?
  2. 如果没有,VBScript 或 JavaScript 是否能够处理所有 206,783 个文件?

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


更新

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

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

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

最佳答案

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

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

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

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

预计到达时间:显然这不是问题所在。你的代码和我的测试代码在 Windows Server 2k3 R2、32 位和 Windows 7 上迭代 dir 输出过程 300k 文件。

关于windows - 如何绕过批处理文件处理限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2425839/

相关文章:

python - 如何编写 python 代码来访问用 C 编写的程序的输入和输出?

c - write() 没有在 C 语言的 Windows 上写入正确数量的字节

java - 如何让Java运行可执行应用程序?

batch-file - 愚蠢的批处理文件行为。尝试执行评论

Windows 批处理 : dropping the last "d" in file names

windows - 批处理文件 : assign decimal value to variable

linux - 关于 Linux 和 Windows 中的死锁

windows - Google 地球插件 - 添加多点触控手势

android - 如何将文件放入准备使用的apk的res文件夹中?

batch-file - 删除除具有特定字符串的文件名之外的所有文件