需要帮助解决使用 7-zip 的 Windows Batch For /R 无限循环

需要帮助解决使用 7-zip 的 Windows Batch For /R 无限循环

我有此脚本的一部分,用于在文件夹结构中以递归方式单独加密/压缩文件。

它可以工作,但似乎它会返回并开始压缩已压缩的文件。我不太清楚是什么原因造成的。

文件夹中的文件名也都是一致的(它们都是图像)。比如“ 2017-08-16 18.16.51.jpg”。一旦每个文件被压缩,它就会命名文件,file1.7z file2.7z file3.7z直到它遍历所有子文件夹中的所有文件。

以下是代码:

SETLOCAL DISABLEDELAYEDEXPANSION
...
...
<MORE SCRIPT HERE>
...
...

set count=0
for /r "%sourcedir%" %%a in (*) do (
CLS
set /A count+=1
SETLOCAL EnableDelayedExpansion
set fnz=file!count!.7z

ECHO ***
ECHO *** ENCRYPTING "%%a" as "!fnz!"
ECHO ***
ECHO *** FILE NUMBER !count! OUT OF !files! 
ECHO ***
ECHO %%a !fnz! >> "!batchdir!7ZIP_FILEREF_!folderzip!.txt"

!batchdir!7z.exe a -mx9 -sdel -p"!password!" -mhe=on "%%~dpa!fnz!" "%%a" >nul

ENDLOCAL
)

...
...
<MORE SCRIPT HERE>
...
...
ENDLOCAL

变量batchdirfolderzip在脚本中较早设置。

以下是从最后一个文件翻转到开始压缩已压缩文件时日志的一些示例输出file100.7z。左侧的文件/文件夹是正在压缩的文件。file###.7z右侧的文件是压缩文件名:

E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-13 13.24.18.jpg file961.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-13 13.25.02.mp4 file962.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-14 18.03.02.mp4 file963.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-15 12.33.20.jpg file964.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.16.51.jpg file965.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.16.53.jpg file966.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.18.26.jpg file967.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.18.27.jpg file968.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.18.29.jpg file969.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-17 13.10.56.jpg file970.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-18 06.59.19.jpg file971.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\BMPhoneWallpaper.png file972.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file100.7z file973.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file101.7z file974.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file102.7z file975.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file103.7z file976.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file104.7z file977.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file105.7z file978.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file106.7z file979.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file107.7z file980.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file108.7z file981.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file109.7z file982.7z 
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file110.7z file983.7z 

就像我说的,到目前为止只有这一个子文件夹Camera 2017。我还有其他文件夹,比如Camera 2014 Camera 2015 Camera 2016等等,压缩完全没有问题。

答案1

for /r 循环按字母顺序对文件进行分段,并在运行时继续分段,因为您正在创建文件

Areon.jpg  ->file22.7z

Banana.jpg ->file23.7z

Canon.jpg  ->file24.7z

Dallas.jpg ->file25.7z

Elephant   ->file26.7z

file01.7z  ->file27.7z

当它到达“f”时,它开始将您使用 7zip 创建的文件包含在列表中。

我想如果源目标文件相同的话你就不会遇到这个问题:

Areon.jpg  ->Areaon.7z
Banana.jpg ->Banana.7z
Canon.jpg  ->Canon.7z

无论如何,如果您正在执行创建文件的操作,那么 /r 并不是最佳选择。

最好将 For /f 与 dir 命令结合使用:

for /f "Delims=" %%a in ('dir /a-d /b /s /a "%sourcedir%\*"') do (

代替:

for /r "%sourcedir%" %%a in (*) do (

相关内容