Почему select-object -first 1 не возвращает массив для согласованности? - PullRequest
1 голос
/ 19 октября 2019

Когда я передаю некоторые объекты в select-object -first n, он возвращает массив, за исключением случаев, когда n равен 1:

PS C:\> (get-process | select-object -first 1).GetType().FullName
System.Diagnostics.Process

PS C:\> (get-process | select-object -first 2).GetType().FullName
System.Object[]

По соображениям согласованности я ожидал, что оба конвейера вернут массив.

Очевидно, PowerShell предпочитает возвращать один объект как объект, а не как элемент в массиве.

Почему это так?

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Почему вопросы обычно неопределенны в подобных случаях, но в основном сводятся к:

  1. Поскольку мы попросили «-первую 1», мы бы знали, что ожидается один элемент.
  2. Если бы мы получили массив / список, нам все равно нужно было бы проиндексировать первый, чтобы получить именно этот, что довольно много для того, для чего предназначен «Select-Object -First 1» (в этом случае.)
  3. Результат всегда может быть заключен в @ () для принудительного создания массива - возможно, в случае, когда мы вычислили «-First $ N» и фактически не знаем (в тот момент в коде)что мы можем получить только 1.
  4. Дизайнер / разработчик подумал, что так и должно быть.

Это # 3, которая удерживает его от проблемы:

$PSProcess = @(Get-Process PowerShell | Select -First 1)

... это гарантирует, что $ PSProcces - это массив независимо от того, что считать.

0 голосов
/ 19 октября 2019

Конвейер вернет объект [System.Diagnostics.Process]. В вашем первом примере это только один объект. Второй - массив [System.Object[]] из [System.Diagnostics.Process].

$a = (get-process | select-object -first 1)
$a | Get-Member

$b = (get-process | select-object -first 2)
,$b | Get-Member
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...