批处理文件为每个文件(在文件夹/子文件夹中)创建 .7z 存档到新目标(文件夹/子文件夹结构)

批处理文件为每个文件(在文件夹/子文件夹中)创建 .7z 存档到新目标(文件夹/子文件夹结构)

我使用批处理文件将文件备份到 7-Zip 存档。它会在原始文件所在的文件夹中为每个文件单独创建一个存档。适用于子文件夹。

FOR /r %%i IN (*.*) DO ( "c:\program files\7-zip\7z.exe" a "%%~i.7z" "%%i" -p"%variable%" -t7z -mx0 -mhe -mmt )

然后我使用 XXCopy 将原始目录树(这里没有复制文件)克隆到新目的地。

XXCopy "%DirectorySource%" "%DirectoryDestination%" /T /ED5 /Q3 /YY

然后我将所有 7z 文件移动到上面的克隆目录结构中。

XXCopy "%DirectorySource%\*.7z" "%DirectoryDestination%" /S /ED /RC /YY /Q3

虽然我想直接在克隆的目录结构中创建 7z 档案,但这种方法效果很好。在源位置无需创建或修改任何文件。

谢谢!

答案1

AutoHotKey 来救场!将自己限制在 Windows 命令行上很痛苦。既然您提到您打算结合 AutoHotKey 执行此循环,为什么不直接使用 AutoHotKey 来完成整个过程呢?

使用长度子字符串提取文件路径的变量部分。文件循环将递归遍历您想要的所有文件。然后只需使用运行等待将您生成的路径传递给 7-Zip。,, Hide末尾指定的RunWait告诉它隐藏生成的命令窗口。

这是一个示例脚本,它包括通过 GUI 选择源文件夹和目标文件夹的功能:

InputBox, password, Enter Password for Archives, The generated archives will be protected with the password you enter below. Your input will be masked., hide
; Using FileSelectFolder is just one way of choosing your folders.
FileSelectFolder, sourcepath,,, Source Folder
sourcepath := RegExReplace(sourcepath, "\\$")  ; Removes the trailing backslash, if present.
FileSelectFolder, destinationpath,,, Destination Folder
destinationpath := RegExReplace(destinationpath, "\\$")  ; Removes the trailing backslash, if present.

; This is the meat of the answer:
sourcelen := StrLen(sourcepath) + 1    ; Determine the start of the variable part of the path.
Loop, Files, %sourcepath%\*.*, R       ; Here's the replacement for your batch file loop.
{
    varfilepath := SubStr(A_LoopFileFullPath, sourcelen) ; Grab everything to the right of the source folder.
    RunWait, "c:\program files\7-zip\7z.exe" a "%destinationpath%%varfilepath%.7z" "%A_LoopFileFullPath%" -p"%password%" -t7z -mx0 -mhe -mmt,, Hide
    FileCount := a_index
}
Msgbox Archives Created: %FileCount%`nSource: %sourcepath%`nDestination: %destinationpath%

请注意,您需要 AHK v1.1.21+ 或更高版本才能使文件循环按书面形式运行。

相关内容