gpt4 book ai didi

function - PowerShell 函数 ValueFromPipelineByPropertyName 不使用别名参数名称

转载 作者:行者123 更新时间:2023-12-03 06:40:00 27 4
gpt4 key购买 nike

尝试创建一个使用别名属性获取管道上的对象的函数。我不确定哪里出了问题。

流程示例:

function Get-Name
{
Param
(
[Parameter(ValueFromPipelineByPropertyName=$true)]
[alias("givenname")]
[System.String] $FirstName,

[Parameter(ValueFromPipelineByPropertyName=$true)]
[alias("sn")]
[System.String] $LastName
)
write-host "firstName = $FirstName / $($FirstName.GetType().FullName)"
Write-host "LastName = $LastName / $($LastName.GetType().FullName)"
}

如果我运行此命令:

Get-Aduser -filter {sn -eq 'smith'} -properties sn,givenname | Get-Name

输出如下所示:

firstName =  / string
LastName = / string

该函数似乎从未从传入的对象中获取 sn 和给定名称属性。我错过了什么?

最佳答案

AD Cmdlet 是罪魁祸首

这里的问题是 AD Cmdlet 以非常非标准的方式返回对象。例如,对于任何其他 cmdlet,如果您获取命令的输出并选择一个不存在的属性,您将不会返回任何内容,如下所示:

get-date | select Hamster

Hamster
-------

>

看,什么都没有。当然,它说的是仓鼠,但那里没有实际的对象。这是标准的 PowerShell 行为。

现在,看看 Get-ADUser 做了什么:

get-aduser -Filter {sn -eq 'adkison'} | select Hamster

Hamster
-------
{}

它创建了一个$null!因此,您的函数将发生的情况是,PowerShell 将查找 -LastName 或 -FirstName 的属性,获取 $null,然后停在那里。太糟糕了!

解决这个问题的最佳方法是像这样交换参数名称,它仍然有效:

function Get-Name
{
Param
(
[Parameter(ValueFromPipelineByPropertyName=$true)]
[alias('FirstName')]
[System.String] $givenname,

[Parameter(ValueFromPipelineByPropertyName=$true)]
[alias("sn","lastname")]
[System.String] $Surname
)
write-host "firstName = $givenname / $($givenname.GetType().FullName)"
Write-host "LastName = $SurName / $($SurName.GetType().FullName)"
}


get-aduser -Filter {sn -eq 'adkison'} | Get-Name

firstName = James / System.String
LastName = Adkison / System.String

想了解更多吗?

查看this awesome answer from /u/JBSmith on the topic.

关于function - PowerShell 函数 ValueFromPipelineByPropertyName 不使用别名参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928911/

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