![](/img/trans.png)
[英]Using Powershell introspection to find the name of a function passed as a parameter?
[英]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
從我能夠確定的內容來看,技術上不是責備AD cmdlet,而是Microsoft.ActiveDirectory.Management
命名空間中的類型 - 在本例中為ADUser
。 ADUser
上的屬性最終都存儲在私有的SortedDictionary
並通過get訪問器獲取,這可以解釋為什么它不能按預期工作。
正如Colyn1337在之前的評論中提到的那樣, ADUser
默認情況下不包含名為sn
或LastName
的屬性(或鍵),因此您需要在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-Object
中Select-Object
所需的特定屬性而不是*。 我認為這是有效的,因為它將ADUser
字典解析為具有混凝土屬性的PSCustomObject
。 解決后,它們將匹配別名以及實際參數名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.