PowerShell下载解压ZIP脚本如何自动覆盖已存在的同名文件
方案1:修改原Shell.Application调用逻辑
你原来的脚本使用Shell.Application COM组件的CopyHere方法,默认不会自动覆盖同名文件,只需要给CopyHere方法传入第二个参数16即可实现静默覆盖:
$Url = "www.link.com/test.zip" $DownloadZipFile = "D:\Test\" + $(Split-Path -Path $Url -Leaf) $ExtractPath = "D:\Test" Invoke-WebRequest -Uri $Url -OutFile $DownloadZipFile $ExtractShell = New-Object -ComObject Shell.Application $ExtractFiles = $ExtractShell.Namespace($DownloadZipFile).Items() # 第二个参数16代表覆盖现有文件且不弹出确认提示 $ExtractShell.NameSpace($ExtractPath).CopyHere($ExtractFiles, 16) Start-Process $ExtractPath
注意:你的原代码里$DownloadZipFile拼接路径漏了反斜杠,我已经补上了,避免最终路径拼接错误。
方案2(更推荐):使用PowerShell原生解压命令
PowerShell 5.1及以上版本自带Expand-Archive cmdlet,专门处理zip解压,逻辑更简单稳定,自带-Force参数直接实现覆盖:
$Url = "www.link.com/test.zip" $DownloadZipFile = Join-Path "D:\Test" (Split-Path -Path $Url -Leaf) $ExtractPath = "D:\Test" Invoke-WebRequest -Uri $Url -OutFile $DownloadZipFile # -Force参数直接覆盖目标路径下的同名文件 Expand-Archive -Path $DownloadZipFile -DestinationPath $ExtractPath -Force Start-Process $ExtractPath
这个方案不用依赖COM组件,避免了COM对象可能出现的权限、释放异常等问题,兼容性和可靠性更高。
内容的提问来源于stack exchange,提问作者user15265211
相关产品推荐
相关产品推荐

