在 Mac 上使用 PowerShell Core 6.1。似乎将数组传递给 ForEach-Object 正在修改或包装每个元素,以便 -is 运算符将所有元素视为 PSCustomObjects。
让我演示一下:
设置一个由四个不同类型的项目组成的数组(使用 JSON,因为这是我真实用例中数据的来源):
$a = '[4, "Hi", {}, true]' | ConvertFrom-Json
按索引迭代列表并确定哪些是 PSCustomObjects:
0..3 | ForEach-Object {
$v = $a[$_]
$t = $v.GetType().FullName
$is = $v -is [PSCustomObject]
"$t - $is"
}
输出(对我来说)正是我所期望的:
System.Int64 - False
System.String - False
System.Management.Automation.PSCustomObject - True
System.Boolean - False
但是,如果我只是将数组传递给 ForEach-Object:
$a | ForEach-Object {
$v = $_
$t = $v.GetType().FullName
$is = $v -is [PSCustomObject]
"$t - $is"
}
现在输出声称所有四个都是 PSCustomObjects:
System.Int64 - True
System.String - True
System.Management.Automation.PSCustomObject - True
System.Boolean - True
谁能解释这里发生了什么?