如何抑制gpresult与Where-Object结合时的空值调用错误?
问题分析
你遇到的错误是因为当Where-Object没有找到匹配行时会返回$null,此时直接调用.Trim()方法会触发“无法对空值表达式调用方法”的运行时错误。-ErrorAction SilentlyContinue仅对PowerShell cmdlet抛出的错误生效,无法抑制空值调用方法这类表达式错误。
另外你的正则表达式存在逻辑问题:Group1_*中的*是正则量词,会匹配0个或多个下划线,而非任意字符。如果要匹配以Group1_开头的组名,应该用Group1_.*(.*代表匹配任意字符任意次数)。
解决方案
以下几种方法可以解决该问题:
方法1:使用Null条件运算符(推荐)
PowerShell 3.0及以上版本支持?.运算符,它会先检查左侧对象是否为$null,若是则不调用后续方法,直接返回$null,不会报错:
$gpresult = gpresult /r $userGroups = ($gpresult | Where-Object { $_ -match 'Group1_.*' -or $_ -match 'Group2_.*' })?.Trim()
方法2:先判断再调用Trim()
先将匹配结果存入变量,通过条件判断决定是否执行Trim():
$gpresult = gpresult /r $matchingGroups = $gpresult | Where-Object { $_ -match 'Group1_.*' -or $_ -match 'Group2_.*' } $userGroups = if ($matchingGroups) { $matchingGroups.Trim() } else { $null }
方法3:捕获表达式错误(冗余,不推荐)
用try/catch包裹表达式,捕获空值调用方法的错误:
$gpresult = gpresult /r try { $userGroups = ($gpresult | Where-Object { $_ -match 'Group1_.*' -or $_ -match 'Group2_.*' }).Trim() } catch { $userGroups = $null }
内容的提问来源于stack exchange,提问作者Franco Canciani
相关产品推荐
相关产品推荐

