我正在使用“执行进程任务”来调用 powershell compress-archive 命令。
对于小文件,它工作正常。
对于 1.25GB 的文件,它失败了。它开始处理然后“完成”但没有创建文件。
鉴于 compress-archive 应使用最大 2GB 的文件,为什么会发生这种情况以及我还有哪些其他选择?
由于无法控制服务器安装,7zip 不是一个选项。
我正在使用“执行进程任务”来调用 powershell compress-archive 命令。
对于小文件,它工作正常。
对于 1.25GB 的文件,它失败了。它开始处理然后“完成”但没有创建文件。
鉴于 compress-archive 应使用最大 2GB 的文件,为什么会发生这种情况以及我还有哪些其他选择?
由于无法控制服务器安装,7zip 不是一个选项。
Compress-Archive是System.IO.Compression.ZipArchive .Net 库的简化包装器。不支持某些功能,例如存储相对路径。异常处理和报告很弱。我通常选择将 .Net 库直接用于任何需要强大异常处理的压缩任务。
使用脚本(对于无人值守的工作来说总是一个好主意)和错误处理,代码并不复杂。这可能无法解决您的问题,但可能会为您提供更多信息:
$ZipPath = 'C:\Temp\test.zip'
$LogPath = "c:\Temp\Archiving-$(get-date -f yyyy-MM-dd).log"
$FilesToZip = (Get-ChildItem 'C:\Temp\*.csv' -File) #trying to compress the zip or log file will result in error: 'process cannot access the file ... in use'
@( 'System.IO.Compression','System.IO.Compression.FileSystem') | % { [void][Reflection.Assembly]::LoadWithPartialName($_) }
Try{
Start-Transcript $LogPath -Append
$WriteArchive = [IO.Compression.ZipFile]::Open( $ZipPath, 'Update')#Update mode also creates a zip
ForEach($file in $FilesToZip){
$ArchivedFile = [IO.Compression.ZipFileExtensions]::CreateEntryFromFile($WriteArchive,
$File.FullName, $file.Name, 'Optimal')
Write-Host "Archived: $($File.FullName) bytes: $($file.Length)"
}
}Catch [Exception]{
Write-Error $_.Exception
}Finally{
$WriteArchive.Dispose() #close the zip file so it can be read later
Stop-Transcript
}
使用 Compress-Archive 的大致等效代码:
Compress-Archive -Path 'C:\Temp\*.csv' -DestinationPath 'C:\Temp\test.zip' -Update
但是Compress-Archive
,在后续运行时会覆盖 .Zip 存档中的条目。CreateEntryFromFile
在存档中创建重复条目。