如何捕获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
相关产品推荐
相关产品推荐

