cmdlet表示无法检索参数:expression必须是可读的

时间:2013-04-08 21:02:03

标签: powershell cmdlets cmdlet

我的cmdlet有一个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);
}

我收到错误:

  

无法处理管道输入,因为参数&#39; Legalentity&#39;的默认值无法检索。获得&#39; Legalentity&#39;的例外情况:expression必须是可读的参数名称:expression

我确信search-Deal正常工作,因为

$a = Search-Deal name 

正在运作。并给予:

Get-Deal $a

返回我想要的确切结果。

然而

$a | Get-Deal 

也会被同一个错误输出。

编辑: 使用

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"] 

所以我认为管道传递对象一定有问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

PowerShell管道的工作方式将阻止这种情况。 Instaed传递整个列表 - 它将逐个传递元素。为防止它发生,您可以使用一元逗号:

, $a | Get-Deals

然而我的建议(作为PowerShell用户):不要这样做,除非你有充分的理由。相反,接受/写入单个对象。这是更自然的,应该让未来的用户有类似的悲伤(实际上相反 - 我希望返回的对象流而不是单个“膨胀”;))

另外:好的做法是用单数名词命名cmdlet。即使你期望更多(Get-Process,Get-Service,Get-ChildItem ......)

答案 1 :(得分:1)

结果是公开的List Legalentity {set {_legalentities = value;缺少吸气剂。

虽然我真的不知道它背后的原因,但添加get {return xxx}将消除错误。

错误然后才有意义。它基本上告诉你需要添加一个getter:

无法处理管道输入,因为无法检索参数“Legalentity”的默认值。获得'Legalentity'的例外:表达式必须是可读的参数名称:表达式