如何正确捕获TreeSizePro的LastExitCode并判断执行成败?
判断TreeSizePro执行成败的最佳实践
首先得说,你原来的脚本有两个关键问题导致错误处理失效:一是手动把$LASTEXITCODE重置为0,直接覆盖了程序实际返回的退出码;二是$?只反映PowerShell是否成功启动了目标程序,而不是程序本身的执行结果——哪怕TreeSizePro参数错得离谱,只要它能正常启动并退出,$?都会返回$true。
针对TreeSizePro这类GUI程序(很多GUI程序默认出错也返回0),我们需要结合退出码、错误输出、结果文件有效性三个维度来综合判断,下面是具体的改进方案:
改进后的PowerShell脚本
# 先定义好路径和参数,避免硬编码 $treeSizeProExe = "TreeSizePro.exe" # 如果不在PATH里,要写完整路径,比如"C:\Program Files\JAM Software\TreeSize Professional\TreeSizePro.exe" $outputExcel = "C:\Temp\ScanResult.xlsx" $scanTarget = "S:" # 运行命令并捕获标准错误流(很多程序会把错误信息输出到这里) $errorMessages = & $treeSizeProExe /NOGUI /DATE /EXPAND 4 /SIZEUNIT 3 /SORTTYPE 0 /EXCEL $outputExcel /SHEETNAME "Data" /SCANPATH $scanTarget 2>&1 # 初始化成功状态 $isSuccess = $true # 检查1:程序退出码(优先看官方文档确认TreeSizePro的退出码规则,部分版本错误时会返回非0) if ($LASTEXITCODE -ne 0) { $isSuccess = $false Write-Warning "TreeSizePro退出码异常:$LASTEXITCODE" } # 检查2:捕获到的错误输出(如果有内容,说明程序执行中出了问题) if ($errorMessages) { $isSuccess = $false Write-Warning "TreeSizePro输出错误信息:`n$errorMessages" } # 检查3:结果文件是否有效(最直观的判断标准——扫描成功应该生成非空的Excel文件) if (-not (Test-Path $outputExcel) -or (Get-Item $outputExcel).Length -eq 0) { $isSuccess = $false Write-Warning "结果文件不存在或为空:$outputExcel" } # 输出最终判断结果 if ($isSuccess) { Write-Host "执行成功" -ForegroundColor Green } else { Write-Host "执行失败" -ForegroundColor Red }
关键细节说明
- 不要手动重置
$LASTEXITCODE:这个变量会在外部程序执行后自动更新,手动赋值会破坏真实的错误状态。 - 捕获标准错误流:用
2>&1把程序的错误输出重定向到标准输出,这样就能捕获到TreeSizePro抛出的参数错误、路径不存在等提示。 - 结果文件校验:这是最可靠的兜底判断——哪怕程序返回码正常、没有错误输出,只要没生成有效的扫描结果文件,就说明执行失败。
如果TreeSizePro支持日志输出(比如部分版本有/LOG参数),还可以添加日志文件的错误关键词检查,进一步提升判断准确性。
内容的提问来源于stack exchange,提问作者DarkLite1
相关产品推荐
相关产品推荐

