Board logo

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

作者: 5i365    时间: 2021-12-25 08:57     标题: 能否使用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
)

作者: 5i365    时间: 2021-12-25 11:44

找到了分卷参数 -v1023m
作者: idwma    时间: 2021-12-25 18:35

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

作者: 5i365    时间: 2021-12-25 18:51

本帖最后由 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\*    ........
作者: idwma    时间: 2021-12-25 19:17

回复 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
复制代码

作者: 5i365    时间: 2021-12-25 19:38

回复 5# idwma


    文件夹名中还有空格的情况,
作者: idwma    时间: 2021-12-25 20:12

回复 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
复制代码

作者: 5i365    时间: 2021-12-31 08:08

本帖最后由 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文件夹 ,其它压缩文件也一样
作者: idwma    时间: 2021-12-31 17:20

本帖最后由 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
复制代码

作者: 5i365    时间: 2022-1-1 12:18

回复 9# idwma


    多谢, 问题1不好解决, 是个难题
作者: idwma    时间: 2022-1-1 15:46

回复 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
复制代码

作者: 5i365    时间: 2022-1-2 19:33

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

回复 9# idwma


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

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

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

回复 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
复制代码

作者: 5i365    时间: 2022-1-2 19:57

回复 13# idwma


    无法执行, 一闪就关了
作者: idwma    时间: 2022-1-2 20:02

回复 14# 5i365


    大意了if前面少了do加上去就好了
作者: 5i365    时间: 2022-1-2 20:11

回复 15# idwma


    可以了, 还是会有空包, 但是空zip包不是0k 是1k
作者: idwma    时间: 2022-1-2 20:28

回复 16# 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"') do (
  5.         if %%j lss 200 (
  6.             del "%%i.7z.001"
  7.         ) else if %%j lss 1073741824 (
  8.             ren "%%i.7z.001" "%%i.7z"
  9.         )
  10.     )
  11. )
  12. pause
复制代码

作者: 5i365    时间: 2022-1-2 20:47

回复 17# idwma


    是个办法, 好像实际大小是32k
作者: 5i365    时间: 2022-1-3 06:48

回复 17# idwma


    好像不是for语句,用&都没有问题, 但是只要for语句, 并成一行, 不做处理一定有问题, 大侠能试试把这个搞成一行吗? 试了好多次, 无果
作者: idwma    时间: 2022-1-3 14:55

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

作者: 5i365    时间: 2022-1-3 18:45

回复 20# idwma


    真是不错, 结果是对的, 但是在执行过程中, 有些错误的提示
--------------------------------------------------------------------------

C:\Users\Administrator\Desktop\A>cmd /c "@echo off&for /f "delims=" %i in ('dir /b /ad') do ("C:\Program Files\7-Zip\7z.
exe" a "%i.7z" ".\%i\*" -p123 -v1023m& for /f "tokens=3" %j in ('dir /-c "%i.7z.001"') do (if %j lss 200 (del "%i.7z.001
") else if %j lss 1073741824 (ren "%i.7z.001" "%i.7z")))"

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 folder, 3 files, 20150760 bytes (20 MiB)

Creating archive: 1 中.7z

Add new data to archive: 1 folder, 3 files, 20150760 bytes (20 MiB)


Files read from disk: 3
Archive size: 20071613 bytes (20 MiB)
Everything is Ok
系统找不到指定的文件。

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
0 files, 0 bytes

Creating archive: 101 日.7z

Add new data to archive: 0 files, 0 bytes


Files read from disk: 0
Archive size: 32 bytes (1 KiB)
Everything is Ok
找不到 C:\Users\Administrator\Desktop\A\101 日.7z.001

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
0 files, 0 bytes

Creating archive: 102 本.7z

Add new data to archive: 0 files, 0 bytes


Files read from disk: 0
Archive size: 32 bytes (1 KiB)
Everything is Ok
找不到 C:\Users\Administrator\Desktop\A\102 本.7z.001

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 folder, 3 files, 17433560 bytes (17 MiB)

Creating archive: 11 美.7z

Add new data to archive: 1 folder, 3 files, 17433560 bytes (17 MiB)


Files read from disk: 3
Archive size: 17247534 bytes (17 MiB)
Everything is Ok
系统找不到指定的文件。

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 folder, 3 files, 17028438 bytes (17 MiB)

Creating archive: 12 国.7z

Add new data to archive: 1 folder, 3 files, 17028438 bytes (17 MiB)


Files read from disk: 3
Archive size: 16872190 bytes (17 MiB)
Everything is Ok
系统找不到指定的文件。

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 folder, 3 files, 26099604 bytes (25 MiB)

Creating archive: 2 国.7z

Add new data to archive: 1 folder, 3 files, 26099604 bytes (25 MiB)


Files read from disk: 3
Archive size: 24190034 bytes (24 MiB)
Everything is Ok
系统找不到指定的文件。

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
0 files, 0 bytes

Creating archive: 202 人.7z

Add new data to archive: 0 files, 0 bytes


Files read from disk: 0
Archive size: 32 bytes (1 KiB)
Everything is Ok
找不到 C:\Users\Administrator\Desktop\A\202 人.7z.001

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
0 files, 0 bytes

Creating archive: 22 人.7z

Add new data to archive: 0 files, 0 bytes


Files read from disk: 0
Archive size: 32 bytes (1 KiB)
Everything is Ok
找不到 C:\Users\Administrator\Desktop\A\22 人.7z.001

C:\Users\Administrator\Desktop\A>pause
请按任意键继续. . .
作者: 5i365    时间: 2022-1-3 18:48

本帖最后由 5i365 于 2022-1-3 19:00 编辑

回复 20# idwma

新开了一个贴, 期待很久了:
http://www.bathome.net/viewthread.php?tid=61208&extra=
作者: 5i365    时间: 2022-1-4 10:23

回复 20# idwma


    看下面这个贴子的最后部分, 他说用cmd /c , 是不是说, 所有的多行批处理命令,中间用&合并后,然后在两边加上"号, 前面加上cmd /c 难道就可以了???
https://superuser.com/questions/ ... windows-commandline
作者: idwma    时间: 2022-1-4 18:30

回复 21# 5i365


    没有过滤第二个循环里dir的结果,这个错误提示不影响的
  1. dir /-c "%%i.7z.001"|findstr "%%i.7z.001"
复制代码
自动转单行这个不会呀
作者: 5i365    时间: 2022-1-5 12:13

回复 20# idwma


   我把上面的改成下面 只处理批处理所在的 0号文件夹,里面文件打包后205M, 但是 把  lss 200 即使改为20 还是会被删除, 没有任何压缩包留下, 哪里出了问题?

cmd /c ""C:\Program Files\7-Zip\7z.exe" a "0号.7z" "0号\*" -p123 -v1023m & if "0号.7z.001" lss 200 (del "0号.7z.001") else if "0号.7z.001" lss 1073741824 (ren "0号.7z.001" "0号.7z")"
作者: 5i365    时间: 2022-1-5 13:33

改成下面这样也不行:
cmd /c ""C:\Program Files\7-Zip\7z.exe" a "0号.7z" "0号\*" -p123 -v1023m & if "dir /-c "0号.7z.001"" lss 200 (del "0号.7z.001") else if "0号.7z.001" lss 1073741824 (ren "0号.7z.001" "0号.7z")"
作者: idwma    时间: 2022-1-5 14:38

回复 26# 5i365


    为什么要去掉for?
作者: 5i365    时间: 2022-1-5 15:04

回复 27# idwma


    不想打包所有文件夹下的子文件夹了, 只打包 0号 文件夹
作者: idwma    时间: 2022-1-5 16:21

回复 28# 5i365


    里面那层截取大小的for还是要留的
作者: 5i365    时间: 2022-1-5 16:46

回复 29# idwma


我尝试加上, 但是始终搞不定,

刚刚看了下面的文章,
https://www.jb51.net/article/49199.htm

找到了通过一行代码获取文件大小

for /f %%i in ('dir /b "0号.7z.001"') do echo %%~zi
作者: 5i365    时间: 2022-1-5 16:50

回复 29# idwma


    现在搞定了, 但是有点乱,怎样把我要压缩的文件夹名, 定义一个变量, 这样就可以在最开头定义要压缩的文件夹名字了, cmd命令, 并成一行真是太复杂了, powershell 只需要; 就行了

cmd /c ""C:\Program Files\7-Zip\7z.exe" a "0号.7z" ".\0号\*" -p123 -v1023m & for /f %%i in ('dir /b "0号.7z.001"') do (if %%~zi lss 20 (del "0号.7z.001") else if "0号.7z.001" lss 1073741824 (ren "0号.7z.001" "0号.7z"))"
作者: 5i365    时间: 2022-1-5 17:12

回复  5i365
idwma 发表于 2022-1-2 20:28



    怎样修改这个代码,最小的修改变动, 实现只压缩某一个文件夹内的子文件夹, 而不是所有的文件夹? 感觉我前面的修改变动太大了
作者: 5i365    时间: 2022-1-6 19:45

回复  5i365


    1.%a%改成!a!,&之间可能还要用()括起来
2.
idwma 发表于 2021-12-31 17:20



    这里的问题1, 我试了几天了, 还没有成功,试了下面的两种, 请问能否使用powershell实现相同的效果?感谢!
@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 -v1023m))
cmd /c "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 -v1023m))"
作者: 5i365    时间: 2022-1-6 20:12

本帖最后由 5i365 于 2022-1-6 20:32 编辑
回复  5i365


    1.%a%改成!a!,&之间可能还要用()括起来
2.
idwma 发表于 2021-12-31 17:20


用下面这两行还能正确回显:
@echo off&setlocal enabledelayedexpansion&for /f "delims=" %%i in ('dir /b /ad') do set "a=!a! ".\%%i\*""
echo %a%
但是并成一行,就不行了:
@echo off&setlocal enabledelayedexpansion&for /f "delims=" %%i in ('dir /b /ad') do set "a=!a! ".\%%i\*"" &echo %a%
这样可以显示结果, 但是结果是双行的
@echo off&setlocal enabledelayedexpansion&for /f "delims=" %%i in ('dir /b /ad') do (set "a=!a! ".\%%i\*"" &echo !a!)
作者: qixiaobin0715    时间: 2022-1-6 20:45

本帖最后由 qixiaobin0715 于 2022-1-6 20:49 编辑

这样呢:
  1. @echo off&setlocal enabledelayedexpansion&(for /f "delims=" %%i in ('dir /b /ad') do set "a=!a! ".\%%i\*"" )&echo !a!
复制代码

作者: 5i365    时间: 2022-1-6 20:49

回复 35# qixiaobin0715


    感谢,这样还真行了,有powershell的解法吗?
作者: qixiaobin0715    时间: 2022-1-6 20:51

虽然可以,代码难读,不建议这样写。
作者: qixiaobin0715    时间: 2022-1-6 20:53

powershell菜鸟,学习中!!!
作者: 5i365    时间: 2022-1-6 22:53

回复 39# idwma


   
C:\Users\Administrator\Desktop\Test3>powershell "dir|?{$_.PSIsContainer}|\Program Files\7-Zip\7z.exe' a $_'.7z' ".\$_\*"
-p123 -v1023m}"
The string is missing the terminator: '.
    + CategoryInfo          : ParserError: ( [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString


C:\Users\Administrator\Desktop\Test3>pause
请按任意键继续. . .
作者: 5i365    时间: 2022-1-7 08:20

本帖最后由 5i365 于 2022-1-7 08:21 编辑

回复 39# idwma


    dir | ?{ $_.PSIsContainer } 这段能换成 (dir -dir).name 吗? 试了一下, 两个代码回显的结果不一样,
就像上面这样, 有时感觉PS的代码真是比CMD好理解, 而且还短小
作者: 5i365    时间: 2022-1-7 08:26

本帖最后由 5i365 于 2022-1-7 08:31 编辑

回复 39# idwma


    我把代码改成下面这样,成功了,
(dir -dir).name | %{ &'C:\Program Files\7-Zip\7z.exe' a "$_.7z" ".\$_\*" -p123 -v1023m }

但是这是实现,将文件夹分别打包,
我需要将当前文件夹中的所有子文件夹中的文件夹合并起来打包:
代码类似这样, 如果当前文件夹中有A和B两个子文件夹,all是合并打包的文件名,代码将是:
C:\Program Files\7-Zip\7z.exe' a "all.7z" ".\A\*" ".\B\*" -p123 -v1023m
作者: idwma    时间: 2022-1-7 17:46

回复 41# 5i365


    放到bat出错%改成foreach就好了
显示不一样,结果是一样的,win7自带的没有这个参数
  1. (dir -dir).name | %{ $a+=' "{0}" ' -f ".\$_\*" }
  2. $a
复制代码

作者: 5i365    时间: 2022-1-7 19:16

回复 43# idwma


    这个代码不错,怎样在上面的批处理下使用呢?
另外%和foreach我在win7好像都可以运行
作者: 5i365    时间: 2022-1-8 10:09

本帖最后由 5i365 于 2022-1-8 11:04 编辑

回复 45# idwma


    批处理中执行, 一闪而关, 我改成下面也不行:
powershell "&{'C:\Program Files\7-Zip\7z.exe' a "all.7z" $((dir -dir).name | %{ $a+=' "{0}" ' -f ".\$_\*" }) -p123 -v1023m}"
作者: 5i365    时间: 2022-1-8 11:25

本帖最后由 5i365 于 2022-1-8 11:27 编辑

回复 43# idwma


    我想分步实现, 但是下面也无回显:
@echo off
for /f %%i in ('(dir -dir).name ^| foreach{ $a+=' "{0}" ' -f ".\$_\*" };$a') do (set s=%%i)
echo %s%
pause
作者: 5i365    时间: 2022-1-8 17:36

回复 48# idwma


powershell "&'C:\Program Files\7-Zip\7z.exe' a all.7z $(dir|where{$_.PSIsContainer}|foreach{$a+="'\"'+'.\'+$_+'\*'+'\" '" };$a)"
上面能生成all.7z 但是里面是空的, 执行信息里有未找到文件夹的提示

powershell "& dir|where{$_.PSIsContainer}|foreach{$a+="'\"'+'.\'+$_+'\*'+'\" '" };$a"
上面可以并排显示所有子文件夹的信息

powershell "& (dir -dir).name | foreach{ $a+=' "{0}" ' -f ".\$_\*" };$a"
上面的代码好理解和第二行的代码作用一样, 但是执行时出错, 可能是您提到的win7不支持什么的原因
作者: 5i365    时间: 2022-1-8 18:32

回复 50# idwma


    我这里不行, 我的子文件夹的名字 类似这样的  
新建文件夹B - 副本 (2)
作者: 5i365    时间: 2022-1-8 19:25

回复 52# idwma


   
作者: 5i365    时间: 2022-1-8 19:57

回复 54# idwma


    好奇怪
作者: 5i365    时间: 2022-1-8 20:04

回复 54# idwma


    Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> Get-Host


Name             : ConsoleHost
Version          : 5.1.14409.1018
InstanceId       : 3cb1758e-c30e-44ba-87d2-02b30543038a
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : zh-CN
CurrentUICulture : zh-CN
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace



PS C:\Users\Administrator>
作者: 5i365    时间: 2022-1-9 07:58

回复 57# idwma


    刚看到, 试了一下, 还是不行, 和以前的一样的效果
作者: idwma    时间: 2022-1-9 14:34

回复 51# 5i365
  1. powershell -version 2.0 "&'C:\Program Files\7-Zip\7z.exe' a all.7z $(dir|where{$_.PSIsContainer}|foreach{$a+='{0}.\{1}\*{0} ' -f [char]34,$_};$a)"
  2. pause
复制代码

作者: 5i365    时间: 2022-1-9 14:43

回复 52# idwma


    哇塞, 还真行了, 看来真是PS版本的问题




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2