Compress-Archive -Update无法更新Zip内文件?问题咨询
问题解析与解决方案
首次更新重复添加文件的原因
这是PowerShell Compress-Archive 的已知行为,核心问题出在文件路径匹配逻辑上:
- 当你第一次执行
Compress-Archive -Path .\dir1 -Update -DestinationPath .\myZip.zip时,cmdlet会对比本地文件路径和Zip内存储的文件路径。如果原始Zip里的myFile.txt是用不同层级的路径打包的(比如当初打包时的工作目录和现在不一样,或者打包时指定的路径更具体),会导致两者的路径标识不匹配——cmdlet会把它当成新文件,直接添加而非替换。 - 第二次执行相同命令时,本地文件的路径已经和第一次添加的新文件路径完全对齐,这时就能正常触发更新替换,不会再生成重复文件。
解决方法
1. 直接指定单个文件路径
跳过目录,精准定位要更新的文件,确保路径和Zip内的完全一致:
Compress-Archive -Path .\dir1\dir2\dir3\myFile.txt -Update -DestinationPath .\myZip.zip
2. 保持打包与更新的工作目录一致
如果必须通过目录更新,要保证首次打包和后续更新时的当前工作目录完全相同。比如当初是在dir1的上级目录执行打包命令,更新时也得回到这个目录再运行Compress-Archive -Path .\dir1 -Update ...。
3. 用.NET类手动操作(更稳定)
如果需要更精准的控制,直接调用.NET的ZipArchive类来处理:
$zipPath = ".\myZip.zip" $localFile = ".\dir1\dir2\dir3\myFile.txt" $zipEntryPath = "dir1/dir2/dir3/myFile.txt" # 必须和Zip内的文件路径完全一致 # 打开Zip文件并更新指定条目 $zipArchive = [System.IO.Compression.ZipFile]::Open($zipPath, [System.IO.Compression.ZipArchiveMode]::Update) $existingEntry = $zipArchive.GetEntry($zipEntryPath) if ($existingEntry) { $existingEntry.Delete() } [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zipArchive, $localFile, $zipEntryPath) $zipArchive.Dispose()
内容的提问来源于stack exchange,提问作者tboyle3
相关产品推荐
相关产品推荐

