为何PowerShell不同条件赋值的变量GetType()返回结果不同?
问题分析:PowerShell条件赋值中的类型差异
先明确场景:用户JohnDoe仅属于一个组,Select-ExpandProperty memberOf返回单个字符串值,三个变量因赋值逻辑不同,出现类型结果不一致的情况。
1. $g类型符合预期的原因
if ($u) { $g = [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf) }
这里[array]直接作用于Get-ADUser的结果,强制将单个字符串包装为单元素数组,并在分支内部完成赋值。因为没有经过条件语句的整体返回值传递,PowerShell不会对这个数组进行解包,所以$g的类型是Object[]。
2. $i类型符合预期的原因
[array]$i = if ($u) { (Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf) } else { $null }
在变量声明阶段就指定了[array]类型约束,PowerShell会自动对右侧条件语句的结果做数组转换:
- 当分支返回单个字符串时,自动包装为单元素数组;
- 当分支返回
$null时,自动转换为空数组。
因此$i的类型始终是Object[]。
3. $h类型不符合预期的核心原因
$h = if ($u) { [array](Get-ADUser -Identity $u -Properties memberOf|select -ExpandProperty memberOf) } else { $null }
问题出在PowerShell的单元素数组自动解包行为:
- 分支内部的
[array]确实把单个字符串包装成了单元素数组,但这个数组作为条件语句的返回值,在赋值给未指定类型的$h时,PowerShell会自动解包数组,只留下里面的单个字符串值。 - 只有当数组包含多个元素时,PowerShell才会保留数组类型;单元素数组会被简化为元素本身。
如果用户属于多个组,Select-ExpandProperty返回多个字符串,此时[array](...)会生成多元素数组,赋值给$h时就不会被解包,$h.GetType()会返回Object[],这也能验证该逻辑。
内容的提问来源于stack exchange,提问作者CFou
相关产品推荐
相关产品推荐

