Использование PowerShell Core 6.1 на Mac. Похоже, что конвейерная передача массива в 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"
}
Теперь в выходных данных утверждается, что все четыре являются объектами PSCustomObject:
System.Int64 - True
System.String - True
System.Management.Automation.PSCustomObject - True
System.Boolean - True
Может ли кто-нибудь объяснить, что здесь происходит?
[PSCustomObject]
- это псевдоним для[System.Management.Automation.PSObject]
, но не для[System.Management.Automation.PSCustomObject]
. Это означает, что все четыре заключены в[PSObject]
внутриForEach-Object
командлета. Вероятно, потому что параметрInputObject
дляForEach-Object
, набранный как[PSObject]
иForEach-Object
, не выполняет разворачивание. - person user4003407   schedule 12.11.2018