繁体   English   中英

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

[英]PowerShell function ValueFromPipelineByPropertyName not using alias parameter name

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

过程示例:

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和givenname属性。 我错过了什么?

AD Cmdlet应该归咎于此

这里的问题是AD Cmdlets以非标准的方式返回对象。 例如,对于任何其他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

想知道更多?

看看/ u / JBSmith关于这个主题的这个很棒的答案。

从我能够确定的内容来看,技术上不是责备AD cmdlet,而是Microsoft.ActiveDirectory.Management命名空间中的类型 - 在本例中为ADUser ADUser上的属性最终都存储在私有的SortedDictionary并通过get访问器获取,这可以解释为什么它不能按预期工作。

正如Colyn1337在之前的评论中提到的那样, ADUser默认情况下不包含名为snLastName的属性(或键),因此您需要在LastName参数中包含Surname的别名,或者在您的LastName参数中选择sn Get-ADUser电话:

Get-ADUser -Filter {sn -eq 'Adkison'} -Properties sn | Get-Name

这仍然不起作用,但从那里你可以在管道到你的函数之前管道到Select-Object

Get-ADUser -Filter {sn -eq 'Adkison'} -Properties sn | Select * | Get-Name

当然,您也可以在Select-ObjectSelect-Object所需的特定属性而不是*。 我认为这是有效的,因为它将ADUser字典解析为具有混凝土属性的PSCustomObject 解决后,它们将匹配别名以及实际参数名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM