PowerShell 7中函数与控制台类型检查运算符行为不一致问题
PowerShell IsCollection函数始终返回True的原因及解决方法
核心原因:判断对象错误
最常见的问题是你在函数中误将**参数容器(如$args数组)**作为判断目标,而非传入的单个对象本身。
比如依赖自动变量$args的错误写法中,$args本身就是一个[object[]]数组(天生实现IEnumerable接口),无论你传入字符串、数字还是[object]实例,判断的都是这个数组,结果必然为True。
正确的函数实现
要解决这个问题,需要明确指定单个输入参数,直接对传入的对象进行类型检查,同时排除字符串类型:
function IsCollection { param( [Parameter(Mandatory = $true)] [object]$InputObject ) # 逻辑:是IEnumerable但不是字符串 $InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string] }
测试验证
执行以下命令验证结果:
# 字符串 → 返回False IsCollection -InputObject "hello" # 数字 → 返回False IsCollection -InputObject 456 # 纯object实例 → 返回False $lump = New-Object object IsCollection -InputObject $lump # 数组 → 返回True IsCollection -InputObject @(1, 2, 3) # 泛型列表 → 返回True IsCollection -InputObject (New-Object System.Collections.Generic.List[string])
额外说明
如果需要包含哈希表([hashtable])这类不直接实现IEnumerable的集合类型,可以扩展判断逻辑,加入对ICollection或IDictionary接口的检查:
function IsCollection { param( [Parameter(Mandatory = $true)] [object]$InputObject ) $isEnumerable = $InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string] $isCollection = $InputObject -is [System.Collections.ICollection] $isDictionary = $InputObject -is [System.Collections.IDictionary] $isEnumerable -or $isCollection -or $isDictionary }
内容的提问来源于stack exchange,提问作者ornsio
相关产品推荐
相关产品推荐

