Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我的powershell cmdlet参数接受ValueFromPipelineByPropertyName且我有别名时,如何获取原始属性名称?_Powershell_Pipeline - Fatal编程技术网

当我的powershell cmdlet参数接受ValueFromPipelineByPropertyName且我有别名时,如何获取原始属性名称?

当我的powershell cmdlet参数接受ValueFromPipelineByPropertyName且我有别名时,如何获取原始属性名称?,powershell,pipeline,Powershell,Pipeline,函数如何判断参数是作为别名传入的,还是管道属性中的对象作为别名匹配的?它如何获得原始名称? 假设我的Powershell cmdlet接受管道输入,并且我希望使用ValueFromPipelineByPropertyName。我设置了一个别名,因为我可能会得到一些不同类型的对象,并且我希望能够根据收到的内容做一些稍微不同的事情 这行不通 执行它,我们会看到问题 起初,它似乎起了作用: PS> Test-DogOrCitizenOrComputer -Name Keith -DogBreed

函数如何判断参数是作为别名传入的,还是管道属性中的对象作为别名匹配的?它如何获得原始名称?

假设我的Powershell cmdlet接受管道输入,并且我希望使用ValueFromPipelineByPropertyName。我设置了一个别名,因为我可能会得到一些不同类型的对象,并且我希望能够根据收到的内容做一些稍微不同的事情

这行不通 执行它,我们会看到问题 起初,它似乎起了作用:

PS> Test-DogOrCitizenOrComputer -Name Keith -DogBreed Basset
Greetings, Keith, you are a good dog, you cute little Basset
当我们尝试使用
别名时,问题显而易见:

PS> Test-DogOrCitizenOrComputer -Name Calculon -Manufacturer HP
Greetings, Calculon, you are a good dog, you cute little HP
奖励失败,无法通过管道工作:

PS> New-Object PSObject -Property @{'Name'='Fred'; 'Country'='USA'} | Test-DogOrCitizenOrComputer
Greetings, Fred, you are a good dog, you cute little USA

PS> New-Object PSObject -Property @{'Name'='HAL'; 'Manufacturer'='IBM'} | Test-DogOrCitizenOrComputer
Greetings, HAL, you are a good dog, you cute little IBM
$MyInvocation.BoundParameters和$PSBoundParameters都包含已定义的参数名称,而不包含任何匹配的别名。我看不到通过alias匹配实名参数的方法

PowerShell似乎不仅通过别名将参数悄悄地传递到正确的参数,对用户“有帮助”,而且通过将所有别名输入折叠到主参数名称中,对程序员也“有帮助”。这很好,但我不知道如何确定传递给Cmdlet的实际原始参数(或通过管道传递的对象属性)


函数如何判断参数是作为别名传入的,还是管道属性中的对象作为别名匹配的?它如何获得原始名称?

我认为函数没有任何方法可以知道是否使用了别名,但关键是这不重要。在函数内部,您应该始终引用参数,就像它的主名称使用它一样

如果您需要参数的作用不同,这取决于它是否使用了别名所不适用的别名,您应该使用不同的参数,或者使用另一个充当开关的参数

顺便说一句,如果您这样做是因为您想使用多个参数作为
值fromPipelineByPropertyName
,那么您已经可以使用单个参数,并且不需要使用别名来实现这一点

对于每种不同的输入类型(例如,只有一个字符串可以是by value、一个int by value等),接受管道中的值确实需要是唯一的。但可以为每个参数启用按名称接受管道(因为每个参数名称都是唯一的)

PS> New-Object PSObject -Property @{'Name'='Fred'; 'Country'='USA'} | Test-DogOrCitizenOrComputer
Greetings, Fred, you are a good dog, you cute little USA

PS> New-Object PSObject -Property @{'Name'='HAL'; 'Manufacturer'='IBM'} | Test-DogOrCitizenOrComputer
Greetings, HAL, you are a good dog, you cute little IBM