gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:25:06 28 4
gpt4 key购买 nike

函数如何判断参数是否作为别名传入,或者管道属性中的对象是否作为别名匹配?怎么才能得到原名呢?

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

这不起作用

function Test-DogOrCitizenOrComputer
{
[CmdletBinding()]
Param
(
# Way Overloaded Example
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
[Alias("Country", "Manufacturer")]
[string]$DogBreed,

[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=1)]
[string]$Name

)
# For debugging purposes, since the debugger clobbers stuff
$foo = $MyInvocation
$bar = $PSBoundParameters

# This always matches.
if ($MyInvocation.BoundParameters.ContainsKey('DogBreed')) {
"Greetings, $Name, you are a good dog, you cute little $DogBreed"
}
# These never do.
if ($MyInvocation.BoundParameters.ContainsKey('Country')) {
"Greetings, $Name, proud citizen of $Country"
}
if ($MyInvocation.BoundParameters.ContainsKey('Manufacturer')) {
"Greetings, $Name, future ruler of earth, created by $Manufacturer"
}

}

执行它,我们看到问题

起初,它似乎有效:
PS> Test-DogOrCitizenOrComputer -Name Keith -DogBreed Basset
Greetings, Keith, you are a good dog, you cute little Basset

当我们尝试使用 Alias 时,问题就很明显了。 :
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 都包含定义的参数名称,而不是任何匹配的别名。我没有看到通过别名匹配参数的真实名称的方法。

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

函数如何判断参数是否作为别名传入,或者管道属性中的对象是否作为别名匹配?怎么才能得到原名呢?

最佳答案

我认为函数没有办法知道是否使用了别名,但关键是这无关紧要。在函数内部,你应该总是引用参数,就像它被它的主名称使用一样。

如果您需要参数根据是否使用不是别名的别名而采取不同的行为,您应该使用不同的参数,或者作为开关的第二个参数。

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

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

关于powershell - 当我的 powershell cmdlet 参数接受 ValueFromPipelineByPropertyName 并且我有别名时,如何获取原始属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45640171/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com