将每个文件压缩到一个最大 100 MB 的文件夹中,并使用随机名称命名压缩文件

将每个文件压缩到一个最大 100 MB 的文件夹中,并使用随机名称命名压缩文件

是否有一种或多种方法可以压缩每个文件夹中的文件并以随机选择的名称保存?

例如:我有三个主文件夹,名称分别为 A、B、C。每个文件夹包含几个文件。我想压缩每个文件夹中的所有文件,并将压缩文件保存在同一文件夹中。但是,它不应该是文件夹中的一个大压缩文件,而应该分成多个压缩文件,例如每个压缩文件的最大大小为 100 MB。

这可能可以通过命令行来完成。但是,还有其他方法吗,例如使用“Total Commander”工具等?

谢谢

答案1

我想我已经自己解决了这个问题:附加的代码允许压缩指定主文件夹中的子文件夹。它为每个压缩档案设置了 400 MB 的最大文件大小限制。某些路径被排除在压缩之外。压缩的 RAR 文件保存在指定的目标文件夹中。

代码遍历主文件夹中的每个子文件夹并单独压缩它们,同时保留子文件夹出现的顺序,而不是按字母顺序排序。对于每个子文件夹,都会为 RAR 文件生成一个随机名称,并相应地设置压缩路径。

收集每个子文件夹中的所有文件,并据此构建 WinRAR 的命令行参数。WinRAR 作为单独的进程启动以压缩子文件夹。如果压缩过程中出现错误,则会显示错误消息,并提示用户继续。

对每个子文件夹重复整个过程。最后,如果所有 RAR 文件都成功创建,则会显示一条成功消息。

根据您的具体要求调整提供的路径和设置非常重要。

 $sourcePath = "D:\FINISH"
 $maxFileSize = 100MB

 $excludePaths = @("C:\Users\Yavuz\AppData", "C:\WINDOWS\system32\LogFiles")
 $destinationPath = "D:\Test"

 $folders = Get-ChildItem -Path $sourcePath -Directory | Where-Object { 
 $_.FullName - 
 notin $excludePaths }

foreach ($folder in $folders) {
$folderPath = $folder.FullName

if (-not (Test-Path -Path $folderPath)) {
    Write-Host "Folder does not exist: $folderPath"
    Continue
}

$randomName = [System.IO.Path]::GetRandomFileName().Substring(0, 12)
$rarPath = Join-Path -Path $destinationPath -ChildPath "$randomName.rar"

$files = Get-ChildItem -Path $folderPath -File

$commandArgs = @("a", "-r", "-ep1", "-s", "-v400m", "-m0", "-ma5", "-md128m", "- 
mm=", "-ierr", "`"$rarPath`"", "`"$folderPath\*`"")

$process = Start-Process -FilePath "C:\Program Files\WinRAR\WinRAR.exe" - 
ArgumentList $commandArgs -PassThru -WindowStyle Normal -WorkingDirectory 
$folderPath
$process.WaitForExit()

if ($process.ExitCode -ne 0) {
    Write-Host "Error compressing the folder: $folderPath"
    Read-Host "Press any key to continue..."
}
}Write-Host "RAR files were created successfully."

相关内容