PowerShell脚本捕获Get-ChildItem异常后终止执行的问题
解决PowerShell脚本异常终止并跳过日志的问题
核心需求是:当Get-ChildItem执行出错时,立即终止脚本,完全不调用后续的Log-Message函数。以下是修正后的可行脚本:
# 示例日志函数 function Log-Message { param([string]$Message) Write-Host "日志: $Message" } try { # 全局强制将非终止错误转为终止异常 $ErrorActionPreference = 'Stop' $threeMonthsAgo = (Get-Date).AddMonths(-3) # 命令级再叠加ErrorAction确保生效 $targetFiles = Get-ChildItem -Path "E:\" -Filter "*.mp3" -Recurse | Where-Object { $_.LastWriteTime -lt $threeMonthsAgo } # 仅找到文件时执行删除和日志 if ($targetFiles) { $targetFiles | Remove-Item -Force Log-Message "已成功删除3个月前的MP3文件" } else { Log-Message "未找到符合条件的MP3文件" } } catch { # 捕获异常后直接终止脚本,跳过所有后续操作 Write-Error "执行失败: $_" exit 1 }
关键修正说明
- 强制触发终止异常:光给
Get-ChildItem加-ErrorAction Stop可能被全局设置覆盖,在try块内显式设置$ErrorActionPreference = 'Stop',确保任何错误都能被catch捕获并终止流程。 - 异常后直接退出:catch块里的
exit 1会立刻终止脚本,让后续的日志函数完全没机会执行,这是解决你问题的核心。 - 避免无效日志:添加
if ($targetFiles)判断,只有找到目标文件才执行删除和成功日志,避免无文件时的冗余输出。
之前设置失效的常见原因
- 只加了命令级的
-ErrorAction Stop,没覆盖全局$ErrorActionPreference,导致部分非终止错误没被转为异常。 - catch块仅输出错误但没调用
exit,脚本继续执行后续的日志代码。 - 没区分“无文件”和“执行出错”的场景,误把正常的无文件情况当成错误处理。
内容的提问来源于stack exchange,提问作者Shreya Patil
相关产品推荐
相关产品推荐

