关于7Z批次(批处理)压缩如何压缩超过100档案上限?

请问各位大佬…小弟在使用下面7Z压缩批次(批处理文件)…只要遇到超过100档案(100个文件)左右就无法压缩(可能是超过字元的限制)…有什么办法修改一下小弟的批次让它能解除这个限制呢??先谢谢各位大佬了 :+1:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set "ZIP=D:\TOOLS\7-zip x64\7z.exe"
set pwd=123
chcp 65001
set "params=!cmdcmdline:~0,-1!"
set "params=!params:*" =!"
set count=0
for %%G IN (!params!) do (
  set /a count+=1
  set "item_!count!="%%~G""
)
for /L %%n in (1,1,!count!) DO (
  set "source=!item_%%n:~1,-1!"
  for %%A in ("!source!") do set "filename=%%~nA"
  set "archive=!filename!.7z"
  if exist "!source!\" (
    "%ZIP%" a -t7z "!archive!" "!source!\*" -scsUTF-8 -p"%pwd%" -mhe=on -mx0 -xr^^!desktop.ini -xr^^!Thumb.db
  ) else if exist "!source!" (
    "%ZIP%" a -t7z "!archive!" "!source!" -scsUTF-8 -p"%pwd%" -mhe=on -mx0
  ) else (
    echo !source! does not exist.
	pause
	exit
  )
)
endlocal
exit

需要这么高级/复杂的使用方法?
直接*.*,最多排除某些文件类型
再特殊的,先收集到文件列表,再@filelistxxx.txt

1 Like

参数太长的话,先写到临时文件,再从@files.txt读取吧

1 Like

大佬该怎么做[email protected]小弟没试过再麻烦您了… :laughing:

大佬您的方法应该也跟haitao HaitaoSoft该怎么做[email protected]小弟没试过再麻烦您了…

filelist.txt文件内容示范

C:\1.TXT
C:\2.DAT

命令行

7z a archive.7z [email protected]
2 Likes

楼主的批处理是将投进去的每个项目(文件或文件夹)都压缩成单独的7z文件
7z -i 后面接的参数是文件列表,也就是只会压缩成一个7z文件

1 Like

是的…谢谢大佬帮忙解译…也谢谢 3_5105 大佬

啊…抱歉,没认真看
我认为这个问题是在用%%G获取参数时导致的,所以将文件名称从命令行传入改为从list.txt传入:

点击查看折叠的代码
@echo off
setlocal ENABLEDELAYEDEXPANSION
set "ZIP=D:\TOOLS\7-zip x64\7z.exe"
set pwd=123
chcp 65001
set "listfile=list.txt"
if not exist "!listfile!" (
    echo List file does not exist.
    pause
    exit
)

for /f "tokens=*" %%G in (!listfile!) do (
    set "source=%%G"
    for %%A in ("!source!") do set "filename=%%~nA"
    set "archive=!filename!.7z"
    if exist "!source!\" (
        "%ZIP%" a -t7z "!archive!" "!source!\*" -scsUTF-8 -p"%pwd%" -mhe=on -mx0 -xr^^!desktop.ini -xr^^!Thumb.db
    ) else if exist "!source!" (
        "%ZIP%" a -t7z "!archive!" "!source!" -scsUTF-8 -p"%pwd%" -mhe=on -mx0
    ) else (
        echo !source! does not exist.
        pause
        exit
    )
)
endlocal
exit

1 Like
dir /b xxx\*.* > filelistxx.txt
dir /b yy\zzz\*.* >> filelistxx.txt
1 Like

谢谢大佬的用心…但…运行跟原本的一样…一样…超过100应该说超过我猜的啦长度限制8191个字符所以都闪退… :sob:

大佬可有完整代码…非常的感谢您的回覆… :+1:

您可以提供具体的参数和部分文件目录结构嘛

1 Like

大佬因为小弟的这个批处理文档是放在shell:sendto里的只要选取想要压缩的文档 “传送至” 就可以了 所以任何目录都OK… :+1:

啊…您的要求稍微有点高,我这边用您的思路可以到三百个文件名。但是Windows的命令行最长长度有一个定死的8192字符限制,所以对于海量文件名,批处理在启动前连参数都无法获取。故可能需要编写插件以完成任务
比较简单的解决办法:

需要WinRAR

需要360压缩

以上方法在右键两千余个文件/文件夹进行分别压缩时工作良好。另外,上面的软件均有绿色版本可用

比较复杂的解决办法:
如果您要求必须使用7zip,不允许使用其他软件,则可能需要自行编写一个右键菜单插件来完成任务

1 Like

大佬…这…我也会…Bandzip也做的到…需要软件的我都不需要… :laughing:

对了,忘记问了,您的系统具体是?
Windows2000到Windows10、Windows9x、Windows11的右键菜单编写方式不尽相同

1 Like

win10

就单一个目录下的文件…大概四五百的文件…因为不想使用软件完成…所以才想用BAT完成…软件…winrar bandzip我都会…只是想说能不能使用BAT就能完成…谢谢大佬您的回覆…

嗯…暂时先提出一个折中方案,以UTF16编码保存vbs脚本到sendto文件夹,目前它可处理的数量应该在主贴中批处理的五倍左右

vbs脚本
' 获取命令行参数
Dim args, file, sevenZipPath, destination, shell

' 7-Zip 可执行文件路径
sevenZipPath = "D:\TOOLS\7-zip x64\7z.exe"

' 创建 WScript.Shell 对象
Set shell = CreateObject("WScript.Shell")

' 获取传入的命令行参数
Set args = WScript.Arguments

' 遍历每个参数
For Each file In args
        destination = Replace(file, Right(file, Len(file) - InStrRev(file, ".")), ".7z")
        Dim command
        command = """" & sevenZipPath & """ a -t7z """ & destination & """ """ & file & """"
        shell.Run command, 0, True
Next
Set shell = Nothing

稍后可能会有更优解将提交到帖子中,这样方便后续坛友查看

1 Like

好!完美解决
下载压缩包,点击inst.bat注册dll
https://wwgz.lanzouw.com/b00mp1i2ni
密码:8pt9


以MIT协议开放源码,github:


第一次写Windows文件资源管理器扩展,还是踩了很多坑…
不适合您也没关系!可以为之后搜索到我们帖子的坛友提供便利

2 Likes