如何在PowerShell中使用Expand-Archive不覆盖文件且避免忽略错误?
在PowerShell中实现Expand-Archive仅写入不存在的文件(不覆盖且不忽略真实错误)
当然可以实现,而且完全不用通过-ErrorAction SilentlyContinue屏蔽所有错误来达到目的,分PowerShell版本给出具体方案:
PowerShell 7+ 直接用原生参数(推荐)
PowerShell 7及以上版本的Expand-Archive新增了-NoClobber参数,专门用来实现“跳过已存在的文件,仅解压不存在的文件”,同时遇到权限不足、压缩包损坏这类真实错误时,会正常抛出错误提示,不会静默忽略。
示例命令:
Expand-Archive -Path "C:\example\archive.zip" -DestinationPath "C:\example\target" -NoClobber
PowerShell 5.1 兼容方案(Windows默认版本)
如果还在使用PowerShell 5.1,由于该版本的Expand-Archive没有-NoClobber参数,需要手动筛选要解压的文件:
实现步骤:
- 读取压缩包内的所有文件列表
- 逐个检查目标路径中是否已存在对应文件
- 仅复制(解压)目标路径不存在的文件
示例代码:
# 定义压缩包路径和目标文件夹路径 $zipPath = "C:\example\archive.zip" $destPath = "C:\example\target" # 获取压缩包内的所有文件(通过Zip::前缀直接访问压缩包内容) $zipFiles = Get-ChildItem -Path "Zip::$zipPath" -Recurse -File foreach ($file in $zipFiles) { # 计算当前文件在目标文件夹中的完整路径 $targetFilePath = Join-Path -Path $destPath -ChildPath $file.FullName.Replace("Zip::$zipPath\", "") # 仅当目标文件不存在时,执行复制(解压)操作 if (-not (Test-Path -LiteralPath $targetFilePath -PathType Leaf)) { # 确保目标文件所在的文件夹存在 $targetDir = Split-Path -Path $targetFilePath -Parent if (-not (Test-Path -LiteralPath $targetDir)) { New-Item -Path $targetDir -ItemType Directory -Force | Out-Null } # 复制文件到目标路径 Copy-Item -LiteralPath $file.FullName -Destination $targetFilePath } }
说明:
这种方式通过手动判断文件是否存在来避免覆盖,同时复制过程中如果遇到权限问题、压缩包内文件损坏等真实错误,会正常抛出错误信息,不会像-ErrorAction SilentlyContinue那样全部屏蔽。
内容的提问来源于stack exchange,提问作者gknauth
相关产品推荐
相关产品推荐

