PowerShell函数传入$Null时$Data参数验证失败原因查询
问题根因
你遇到的验证失败问题核心是$null比较顺序不符合PowerShell的最佳实践:
- PowerShell中如果将变量放在
$null的左侧做相等判断,当变量为集合类型时,$_ -eq $null会返回集合中所有值为$null的元素,而非布尔值$true,会导致if分支判断异常 - 逻辑异常后会进入
else分支执行$_.GetType(),对$null调用方法会抛出空引用异常,直接导致验证脚本执行失败 - 另外该逻辑也没有兼容
[System.Management.Automation.Internal.AutomationNull]::Value(无输出命令的返回值)的场景,也可能触发验证失败
修复方案
调整ValidateScript块中的比较顺序,将$null放在比较运算符左侧即可,修正后的参数定义如下:
[CmdletBinding()] Param ( [Parameter(HelpMessage = "PsObject data.")] [AllowNull()] [AllowEmptyCollection()] [AllowEmptyString()] [ValidateScript({ # 将$null放在比较左侧,保证返回结果始终是布尔值 if ( ($null -eq $_) -or ($_ -eq '') ){ $true } else { (( !($_.GetType().IsValueType) ) -and ( $_ -isnot [string] )) } })] $Data, ...
调整后传入$null时会正确进入if分支返回$true,验证逻辑可正常通过,原有[AllowNull()]等特性不需要额外修改,验证规则也和你最初的设计完全一致。
内容的提问来源于stack exchange,提问作者Alexey I. Kuzhel
相关产品推荐
相关产品推荐

