0

我的 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);
}

我收到一个错误:

无法处理管道输入,因为无法检索参数“合法性”的默认值。获得“合法性”的异常:表达式必须可读参数名称:表达式

我确信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"] 

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

感谢您的帮助!

4

2 回答 2

2

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

, $a | Get-Deals

但是我的建议(作为 PowerShell 用户):除非您有充分的理由,否则不要这样做。相反,接受/写入单个对象。这更自然,并且应该避免将来的用户像现在这样的悲伤(实际上完全相反-我希望返回对象流而不是单个“膨胀”;))

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

于 2013-04-08T21:39:01.383 回答
1

原来公开列表合法性{ set { _legalentities = value; } } 缺少吸气剂。

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

那么这个错误是有道理的。它基本上告诉您需要添加一个吸气剂:

无法处理管道输入,因为无法检索参数“合法性”的默认值。获得“合法性”的异常:表达式必须可读参数名称:表达式

于 2013-04-11T22:05:28.897 回答