Оператор PowerShell 'in' и Object[]

Мне нравится находить все разделы диска, которые находятся на диске iSCSI, с помощью PowerShell.

Чтобы найти все идентификаторы дисковых объектов iSCSI, мы можем использовать:

Get-Disk | Where BusType -ieq iscsi | Select -prop ObjectId

Используя оператор in, это должно вернуть все разделы:

Get-Partition | Where DiskId in (Get-Disk | Where BusType -ieq iscsi | Select -prop ObjectId)

К сожалению, эта команда возвращает типичную ошибку PowerShell:

Where-Object : A positional parameter cannot be found that accepts argument 'System.Object[]'.
At line:1 char:17
+ Get-Partition | Where DiskId in (Get-Disk | Where BusType -ieq iscsi | Select -p ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Where-Object], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.WhereObjectCommand

Как правильно использовать оператор in?


person Tom    schedule 16.04.2015    source источник
comment
Обратите внимание, что это оператор -in, а не in.   -  person Bacon Bits    schedule 30.12.2018


Ответы (1)


select -prop ObjectId не делает то, что вы думаете. Он создает новый объект, который имеет подмножество свойств.

Вместо этого используйте select -exp ObjectId. Он возвращает сами значения свойств, не оборачивая их в пользовательский объект.

Get-Partition | Where DiskId -in (Get-Disk | Where BusType -ieq iscsi | Select -exp ObjectId)
person Markus Jarderot    schedule 16.04.2015
comment
Так круто! Большое спасибо за объяснение и решение! - person Tom; 16.04.2015