7Zip+PowerShell脚本中$LastExitCode异常问题求助
PowerShell调用7Zip压缩验证后删除源文件:问题分析与解决方案
问题背景
我编写了一段PowerShell脚本,流程为调用7Zip压缩文件,再测试生成的压缩包,期望通过$LastExitCode判断操作是否成功,仅在压缩和测试均通过时删除源文件。但测试时注释压缩步骤、删除目标压缩包后,测试步骤报错(Error:cannot find archive),却仍执行了删除源文件的操作,不清楚问题出在哪,求正确实现该需求的方法。
初始脚本
ForEach ($File in $Files) { 7zip a “$DestDir\$file.7z” "$SourceDir\$File" -m0=LZMA2 -mx=9 -mmt4 | findstr /I "archive everything error" | Out-File $LOGPath -Force -Append 7zip t "$DestDir\$file.7z" | findstr /I "testing size compressed archive everything error" | Out-File $LOGPath -Force -Append if ($LASTEXITCODE -eq 0) { Write-Output “Compression SUCCEEDED and zip file tested OK” | Out-File $LOGPath -Force -Append Write-Output “DELETING ORIGINAL file - $File `n” | Out-File $LOGPath -Force -Append Remove-Item -Path “$SourceDir\$File” | Out-File $LOGPath -Force -Append } else { Write-Output “Compression FAILED, source file not deleted `n” | Out-File $LOGPath -Force -Append } }
问题根源
- 退出码被管道命令覆盖:初始脚本中,7Zip命令通过管道传给
findstr,而PowerShell的$LASTEXITCODE记录的是管道最后一个命令的退出状态,而非7Zip本身的执行结果。比如测试时7Zip找不到压缩包返回非0,但findstr匹配到了输出中的"error"字符串,会返回0,导致脚本误判操作成功。 - 未分步校验操作结果:脚本连续执行压缩和测试,仅判断最后一步的退出码,无法确保压缩和测试两步都成功。
修改后的可行脚本
ForEach ($File in $Files) { Write-Output “Compressing $File” | Out-File $LOGPath -Force -Append 7zip a "$DestDir\$file.7z" "$SourceDir\$File" -m0=LZMA2 -mx=9 -mmt4 if ($LASTEXITCODE -eq 0) { Write-Output "Compression SUCCEEDED" | Out-File $LOGPath -Force -Append Write-Output “TESTING compressed file - $File” | Out-File $LOGPath -Force -Append 7zip t "$DestDir\$file.7z" if ($LASTEXITCODE -eq 0) { Write-Output "Zip file tested OK" | Out-File $LOGPath -Force -Append Write-Output "DELETING original file - $File `n" | Out-File $LOGPath -Force -Append #Remove-Item -Path “$SourceDir\$File” | Out-File $LOGPath -Force -Append } else { Write-Output “Zip test FAILED, source file not deleted `n” | Out-File $LOGPath -Force -Append } } else { Write-Output "Compression FAILED for file - $file - moving onto next file" | Out-File $LOGPath -Force -Append } }
修改说明
- 移除管道
findstr:直接执行7Zip命令,让$LASTEXITCODE准确反映7Zip的执行状态,避免被后续命令覆盖。如果需要筛选日志,可以在命令执行后单独处理输出,而非通过管道影响退出码。 - 分步校验退出码:先判断压缩是否成功,只有压缩成功才执行测试;测试通过后再执行删除源文件操作,确保两步都无问题才删除。
- 细化日志输出:每一步操作的状态都明确写入日志,便于后续排查问题。
内容的提问来源于stack exchange,提问作者pelagos
相关产品推荐
相关产品推荐

