Похоже на ошибку, нет?
Не ошибка как таковая, но неожиданное следствие разработки параметров командлета Get-Service
:
Прикрепление атрибута ValueFromPipeline
к параметру, набранному [string]
/ [string[]]
или [object]
/ [object[]]
(или [psobject]
/ [psobject[]]
), приводит к привязке этого параметра к любому конвейерувведите , возможно в дополнение к привязке к другим параметрам - , если этот параметр не связан с аргументом командной строки , который является вашим -Name *
обходной путь делает.
- Причина в том, что экземпляры любого типа данных могут быть преобразованы в
[string]
/ получены из [object]
([psobject]
), вызывая любой объект ввода, независимо от типа, для привязки к этому параметру.
Вкратце: проблема здесь не в том, что [pscustomobject]@{computername='comp001'}
не привязано к -ComputerName
- на самом деле равно - это то, что это также связано с -Name
, неизменно.
PowerShell связыватель параметров фундаментально связывает входные данные конвейера с всеми подходящими параметрами , а не только с одним.
Как уже говорилось, единственный способ предотвратить связывание -Name
с конвейер должен передать значение по аргументу - даже если это значение просто *
, чтобы сигнализировать о включении служб любого имени.
Поведение теперь также обсуждается на GitHub .
Примечание:
Как указывает js2010 (OP), it можно осмысленно комбинироватьатрибуты ValueFromPipeline
и ValueFromPipelineByPropertyName
в параметре single , как это делает Get-Service
, но обратите внимание на ограничения:
It работает только для параметра , а не , набираемого [object]
или [psobject]
/ [object[]]
или [psobject[]]
(такой параметр неизменно связывает все по значению никогдас учетом свойств ).
- Если типом является
[string]
или [string[]]
, свойства имеют значение сначала красный, но у вас не может быть дополнительных параметров привязки к конвейеру , потому что это представляет исходную проблему: параметр [string]
/ [string[]]
будет неизменно также bind.
Тип свойства входного объекта, соответствующего имени параметра, должен либо соответствовать типу параметра, либо, по крайней мере, быть конвертируемым , чтобы быть связанным.
Вот пример команды, которая привязывает тот же сервис к -Name
сначала как строка, а затем как объект со свойством .Name
:
'rpcss', [pscustomobject] @{ Name = 'rpcss' } | Get-Service