2013-04-08 4 views
0

Моего командлет имеет Get-Deal команду, которая будет получать значения из трубопровода:Командлета говорит параметр не может быть получен: выражение должно быть читаемым

[Cmdlet(VerbsCommon.Get, "Deal")] 
public class GetDealCmdlet : InsightBaseCmdlet 
{ 
    private List<Object> _legalentities = new List<Object>(); 
    [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true,ValueFromPipelineByPropertyName = true)] 
    public List<Object> Legalentity { set { _legalentities = value; } } 


    protected override void ProcessRecord() {...} 
} 

Он отлично работает, если я передал список строки или других типов. Однако, если я передал объект, который создается в Search-Deal:

foreach (...) 
{ 
    PSObject dealValue = new PSObject(); 
    dealValue.Properties.Add(new PSNoteProperty(Legalentity,Convert.ToInt32($deal.Properties["LegalEntityID"].Value.ToString()))); 
    dealValue.Properties.Add(new PSNoteProperty("Name",deal.Properties["name"].Value.ToString())); 
    WriteObject(dealValue); 
} 

Я получаю сообщение об ошибке:

Pipeline input cannot be processed because the default value of parameter 'Legalentity' cannot be retrieved. Exception getting 'Legalentity' : expression must be readable Parameter Name: expression

Я уверен, что search-Deal работает нормально, потому что

$a = Search-Deal name 

работает. И предоставление:

Get-Deal $a 

возвращает точный результат, который я хочу.

Однако

$a | Get-Deal 

выдаст ошибку одним и тем же тоже.

EDIT: использованием

Trace-Command -Name ParameterBinding -Expression { Search-Deal JL | Get-Deal } -PSHost 

я нашел следующее:

CALLING BeginProcessing 
BIND PIPELINE object to parameters: [Get-Deal] 
PIPELINE object TYPE = [System.Management.Automation.PSCustomObject] 
RESTORING pipeline parameter's original values 
BIND PIPELINE object to parameters: [Out-Default] 
PIPELINE object TYPE = [System.Management.Automation.ErrorRecord] 
Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION 
BIND arg [Pipeline input cannot be processed because the default value of parameter 'LegalEntity' cannot be retrieved. Exception getting "LegalEntity": "Expression must be readable Parameter name: expression"] 

Так что я думаю, что это должно быть что-то не так с трубопровода передачи объектов.

Спасибо за помощь!

ответ

1

Оказалось, что публичный список Legalentity {set {_legalentities = value; }} отсутствует получатель.

хотя я действительно не знаю причины этого, добавив, что get {return xxx} устранит ошибку.

Ошибка тогда имеет смысл. В основном говорят, что вам нужно добавить getter:

Ввод трубопровода не может быть обработан, потому что значение по умолчанию параметра «Правомерность» невозможно получить.Исключение получения «Правомерность»: выражение должно быть читаемым Имя параметра: выражение

2

Способ работы трубопровода PowerShell предотвратит такой сценарий. Instaed of total list - он будет проходить элементы один за другим. Чтобы не допустить этого вы можете использовать унарную запятую:

, $a | Get-Deals 

Однако мое предложение (как пользователь PowerShell): не делайте этого, если у вас есть очень веские причины. Вместо этого, принимайте/пишите отдельные объекты. Это более естественно и должно избавить будущих пользователей от подобных гонений, которые у вас есть сейчас (совершенно наоборот - я бы ожидал, что поток объектов вернулся, а не один «раздутый»;))

Также: хорошая практика - назвать командлеты с сингулярным существительным , Даже если вы ожидаете больше обычного (Get-Process, Get-Service, Get-ChildItem ...)

+0

Переименовано в сингулярное :) Чтобы быть более конкретным, объект поиска-сделки записывает объект в цикл: foreach() {PSObject dealValue = новый PSObject(); ... WriteObject (dealValue);}, поэтому он передает один объект за раз. также Get-Deal может взять список (который сохраняет возможность передавать переменную списка в параметр вместо конвейерной обработки, как показано), но в случае с конвейером я думаю, что он занимает один объект за раз из предыдущего цикла. Я попробовал, $ a | Get-Deals, но, похоже, не работает, хотя ... – jamesdeath123

+0

Я должен был прочитать это неправильно в первый раз. Во всяком случае: я бы проверял «Trace-Command -Name ParameterBinding» - ясно, что что-то в связующем значении параметра вызывает эту проблему, поэтому больше информации о трассировке может быть полезна. Я вижу свойство, которое соответствует параметру в выходном объекте Search-Deal, возможно, это вызывает эту проблему? И последнее, но не менее важное: я вижу '$ deal' внутри' ToInt32', разве это не будет 'сделка' ...? – BartekB

+0

$ deal - это еще один PSObject, который Search-deal принимает идентификатор и передает его в конвейер как свойство dealValue. Я как бы делаю это $ deal, чтобы определить, что это переменная :) Я не знаком с Trace-Command, и я использовал: Trace-Command -Name ParameterBinding {Search-Deal JL | Get-Deal} и та же ошибка. Не могли бы вы рассказать мне, как мне использовать Trace-Command? Кроме того, вы упомянули свойство, которое соответствует параметру в выходном объекте Search-Deal, и это может вызвать проблему. Я попытался переименовать имя параметра Get-Deal, но здесь не очень помогает. – jamesdeath123