[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 能否使用7z直接汇总子文件夹后再分卷+加密打包

本帖最后由 5i365 于 2021-12-25 08:58 编辑

情况描述如下:
一个主文件夹 1
其下有两个子文件夹 A  和  B
A文件夹下有 A1, A2, A3 ..... 等N个子文件夹
B文件夹下有 B1, B2, B3 ..... 等N个子文件夹

我想使用7z 把A和B下的所有子文件夹打包成1.zip, 解压密码 123
即: 把 A1, A2, A3, B1, B2, B3....  打包成1.zip
另外, 如果打包成一个zip文件, 就太大了, 所以打包时按每卷 1023m 来打包
找到下面一个批处理, 它是一个文件夹一个包, 没有将所有子文件夹汇总的参数和压缩时分卷的参数,求高手指点, 感谢!

@echo off
cd /d "%~dp0"
for /f "delims=" %%i in ('dir /b /ad') do (
    "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -p123
)

找到了分卷参数 -v1023m

TOP

  1. "C:\Program Files\7-Zip\7z.exe" a ab.7z .\a\* .\b\*
复制代码
1

评分人数

TOP

本帖最后由 5i365 于 2021-12-25 18:59 编辑

回复 3# idwma


上面A和B是已知的文件夹名,
如果在不知道1文件夹下一级子文件夹数量和名字的情况下, 怎么处理? 我是把批处理放到桌面上的, 桌面上有文件夹1 ,里面有子文件夹A, B, C, D.......

那就得这么长了, 怎样生成这么长的命令?

"C:\Program Files\7-Zip\7z.exe" a ab.7z .\1\A\* .\1\B\* .\1\C\* .\1\D\*    ........

TOP

回复 4# 5i365
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad') do set "a=!a! .\%%i\*"
  4. echo %a%
  5. pause
复制代码

TOP

回复 5# idwma


    文件夹名中还有空格的情况,

TOP

回复 6# 5i365
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad') do set "a=!a! ".\%%i\*""
  4. "C:\Program Files\7-Zip\7z.exe" a ab.7z %a% -p123 -v1023m
  5. pause
复制代码

TOP

本帖最后由 5i365 于 2021-12-31 08:10 编辑

回复 7# idwma


    你好, 刚刚测试了一下, 发现两个小问题:
1. 因为目标软件只能执行一行批处理命令, 所以我用&把所有cmd命令并在一行当中, 可以执行,但是和不并之前, 压缩的结果完全不同, 把批处理文件和当前文件夹下的文件夹打包了
@echo off&setlocal enabledelayedexpansion & for /f "delims=" %%i in ('dir /b /ad') do set "a=!a! ".\%%i\*"" & "C:\Program Files\7-Zip\7z.exe" a ab.7z %a% -p123 -v10m

2. 批处理中的压缩文件名是ab.7z  怎样用一级文件夹的名字做压缩文件名?
例如:
批处理7z.bat所在的文件夹下,
有A B C ... 多个1级文件夹,
A文件夹中,有A1  A2  A3 .... 多个二级文件夹
同样:
B文件夹中,有B1  B2  B3 .... 多个二级文件夹
......
批处理双击后,
将A文件夹下的所有二级文件夹打包到A.7z中 打包参数 -p123 -v10m
将B文件夹下的所有二级文件夹打包到B.7z中 打包参数 -p123 -v10m
......
当我打开A.7z压缩包后, 直接能看到的是 A1 A2 A3文件夹, 而不是A文件夹 ,其它压缩文件也一样

TOP

本帖最后由 idwma 于 2021-12-31 17:50 编辑

回复 8# 5i365


    1.%a%改成!a!,&之间可能还要用()括起来
2.
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad') do "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" ".\%%i\*" -p123 -v1023m
  3. pause
复制代码

TOP

回复 9# idwma


    多谢, 问题1不好解决, 是个难题

TOP

回复 10# 5i365

什么软件,如果只支持一条命还可以试试cmd /c "dir"的方式
循环放在一行的问题,举几个例子,不知道这样好不好理解
  1. for /f "delims=" %%i in ('dir /b /ad') do echo a
  2. echo b
  3. for /f "delims=" %%i in ('dir /b /ad') do echo a&echo b
  4. for /f "delims=" %%i in ('dir /b /ad') do (echo a)&echo b
  5. (for /f "delims=" %%i in ('dir /b /ad') do echo a)&echo b
复制代码

TOP

本帖最后由 5i365 于 2022-1-2 19:35 编辑

回复 9# idwma


    现在有个现实的问题, 如果我设了 -1023m 分卷大小, 但是文件压缩后的大小没有超过1023, 压缩包的文件名还会是 abc.7z.001

如何加上条件判断, 包大小超1024m时, 才像上面名字似的分卷打包, 不超时压缩文件名就是abc.7z

另外, 当文件夹内为空时,也会打包成一个空包, 怎样也加个判断,空时不再打包? 感觉上面的判断有点困难, 因为怎样能获得压缩后的大小?

TOP

回复 12# 5i365
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad') do (
  3. "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" ".\%%i\*" -p123 -v1023m
  4. for /f "tokens=3" %%j in ('dir /-c "%%i.7z.001"') if %%j lss 1073741824 ren "%%i.7z.001" "%%i.7z"
  5. )
  6. pause
复制代码

TOP

回复 13# idwma


    无法执行, 一闪就关了

TOP

回复 14# 5i365


    大意了if前面少了do加上去就好了

TOP

返回列表