簡體   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