You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)判断,只有找到目标文件才执行删除和成功日志,避免无文件时的冗余输出。

之前设置失效的常见原因

  1. 只加了命令级的-ErrorAction Stop,没覆盖全局$ErrorActionPreference,导致部分非终止错误没被转为异常。
  2. catch块仅输出错误但没调用exit,脚本继续执行后续的日志代码。
  3. 没区分“无文件”和“执行出错”的场景,误把正常的无文件情况当成错误处理。

内容的提问来源于stack exchange,提问作者Shreya Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:27:47