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

如何捕获Get-ChildItem的非终止错误同时保留返回数据?

问题解答

一、如何在返回数据的同时捕获并忽略特定错误

要实现获取可访问的注册表子项数据,同时仅忽略针对Properties子项的权限错误(保留其他错误),可以结合-ErrorVariable和-ErrorAction SilentlyContinue,后续再过滤错误变量中的特定错误:

# 执行Get-ChildItem,收集错误到regErrors,同时继续执行命令
$adapterKeys = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}" -ErrorAction SilentlyContinue -ErrorVariable regErrors

# 处理已获取的子项数据
$adapters = $adapterKeys | Get-ItemProperty
$adapters | Select -First 1

# 过滤并抛出非目标错误
$nonIgnorableErrors = $regErrors | Where-Object {
    # 排除针对Properties子项的SecurityException
    -not ($_.Exception -is [System.Security.SecurityException] -and $_.TargetObject -like "*\Properties")
}

# 如果存在其他错误,正常抛出
if ($nonIgnorableErrors) {
    $nonIgnorableErrors | ForEach-Object { Write-Error $_ }
}

原理说明:

  • -ErrorAction SilentlyContinue:让命令遇到非终止错误时不中断,继续枚举可访问的子项,确保能拿到有效数据。
  • -ErrorVariable regErrors:将所有错误收集到变量regErrors中,方便后续处理。
  • 过滤逻辑:仅忽略针对Properties子项的权限错误,其他类型的错误(如路径不存在、其他权限问题等)会被重新抛出,避免遗漏重要错误。

二、Get-ChildItem与-ErrorAction Stop的行为是否符合预期

完全符合PowerShell的设计预期:

  • 默认行为(无-ErrorAction Stop):Get-ChildItem遇到无法访问的子项时,抛出的是半终止错误。这类错误不会中断命令执行,命令会跳过当前不可访问的子项,继续枚举后续可访问的项,因此你能拿到部分有效数据。
  • 指定-ErrorAction Stop时:PowerShell会将所有半终止错误转换为终止错误。终止错误会立即中断命令执行,命令不会继续处理后续子项,因此无法返回任何数据(因为在遇到Properties子项的权限错误时就停止了)。

补充说明:

目标路径下的Properties子项是Windows系统默认设置的高权限项,即使本地管理员账号也无访问权限,这个错误属于场景内的预期错误,但不影响其他网卡配置子项的获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:53:09