PowerShell压缩脚本问题:屏蔽输出与捕获正确错误信息
两个PowerShell压缩归档问题的解决方案
一、屏蔽CreateEntryFromFile的控制台输出
CreateEntryFromFile执行后会返回ZipArchiveEntry对象,ForEach-Object会默认将这些对象输出到控制台,导致打印文件详细信息。只需抑制该命令的输出即可解决,有三种常用方式:
- 方式1:将结果重定向到
$null - 方式2:通过
Out-Null过滤输出 - 方式3:将结果赋值给
$null变量
修改后的示例脚本:
Add-Type -assembly "system.io.compression.filesystem" $compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest $zip = [System.IO.Compression.ZipFile]::Open('c:\temp\archive.zip', 'update') $files = Get-ChildItem c:\folder | Where-Object {$_.Attributes -ne 'Directory'} # 方式1:重定向到$null $files | ForEach-Object { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $_.FullName, $_.Name, $compressionLevel) > $null } $zip.Dispose()
或者用方式3更简洁:
$null = $files | ForEach-Object { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $_.FullName, $_.Name, $compressionLevel) }
二、让Compress-Archive捕获真实错误信息
Compress-Archive会将底层异常包装在外层通用异常中,直接获取$_.Exception.Message只能得到模糊提示。需要两步解决:
- 添加
-ErrorAction Stop参数,确保所有错误都转为终止错误进入catch块; - 访问
$_.Exception.InnerException.Message获取真实错误详情。
示例代码:
try { Compress-Archive -Path 'c:\folder\*' -DestinationPath 'c:\temp\archive.zip' -Update -ErrorAction Stop } catch { $realError = $_.Exception.InnerException.Message Write-Host "错误详情: $realError" }
如果遇到多层嵌套异常,可进一步访问$_.Exception.InnerException.InnerException.Message,但大多数场景下一层InnerException就能拿到真实错误(比如文件被占用的提示)。
内容的提问来源于stack exchange,提问作者Norman
相关产品推荐
相关产品推荐

