我的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"]
所以我认为管道传递对象一定有问题。
感谢您的帮助!
答案 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'的例外:表达式必须是可读的参数名称:表达式