function - PowerShell फ़ंक्शन ValueFromPipelineByPropertyName उपनाम पैरामीटर नाम का उपयोग नहीं कर रहा है




parameters alias (2)

एक फ़ंक्शन बनाने की कोशिश कर रहा है जो ऊपरी संपत्ति का उपयोग करके पाइप लाइन पर ऑब्जेक्ट लेता है। मुझे यकीन नहीं है कि यह गलत क्यों हो रहा है।

प्रक्रिया का उदाहरण:

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

फ़ंक्शन को स्नैप और दिए गए विशेषताओं को ऑब्जेक्ट में पारित करने से कभी नहीं मिला है। मैं क्या खो रहा हूँ?


मैं जो निर्धारित करने में सक्षम हूं, यह तकनीकी रूप से एडी सीएमडीलेट नहीं है, जो कि इसके लिए जिम्मेदार हैं, लेकिन Microsoft.ActiveDirectory.Management के प्रकार। ADUser । प्रबंधन नाम स्थान - इस मामले में, ADUser ADUser पर संपत्ति अंततः सभी एक निजी SortedDictionary में संग्रहित होती है और SortedDictionary प्राप्त करने के माध्यम से प्राप्त होती है, जो यह समझा सकती है कि यह अपेक्षित रूप से काम क्यों नहीं करता है।

जैसा कि पिछले टिप्पणी में Colyn1337 द्वारा संकेत दिया गया है, एड्यूज़र में डिफ़ॉल्ट रूप से sn या LastName नामित एक संपत्ति (या कुंजी) नहीं है, इसलिए आपको अपने LastName पैरामीटर पर उपनाम के Surname शामिल करना होगा या अपने LastName चुनें Get-ADUser कॉल:

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

यह अभी भी काम नहीं करेगा, लेकिन वहां से आप अपने फ़ंक्शन को पाइप करने से पहले Select-Object का Select-Object करने के लिए पाइप कर सकते हैं:

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

बेशक, आप केवल चुनिंदा Select-Object में * की जगह विशिष्ट गुणों का चयन भी कर सकते हैं। मैं यह काम मानता हूं क्योंकि यह PSCustomObject डिक्शनरी को ठोस गुणों के साथ एक PSCustomObject में हल करता है एक बार हल हो जाने पर, वे उपनाम के साथ-साथ वास्तविक पैरामीटर नामों से मेल खाएंगे।


एडी सीएमडीलेट्स को यहां दोष देना है

यहां समस्या यह है कि एडी सीएमडीलेट वास्तव में गैर-मानक तरीकों से वस्तुएं वापस ले जाती हैं। उदाहरण के लिए, यदि आप कमांड के आउटपुट को लेते हैं और किसी गैर-मौजूदा प्रॉपर्टी का चयन करते हैं, तो आप किसी भी अन्य सीएमडीलेट के साथ, कुछ भी नहीं मिलेंगे, जैसे:

get-date | select Hamster

Hamster                                                                                                                                                                                                                        
-------     

>

कुछ भी नहीं देखते। यकीन है, हम्सटर कहते हैं, लेकिन वहां कोई वास्तविक वस्तु नहीं है यह मानक PowerShell व्यवहार है

अब, देखें कि एड-एड-एज क्या है:

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

Hamster                                                                                                                                                                                                                        
-------                                                                                                                                                                                                                        
{}                    

यह एक $ रिक्त बनाता है! तो आपके फ़ंक्शन के साथ क्या होगा कि PowerShell -ListName या -FirstName की संपत्ति की खोज करेगा, $ शून्य प्राप्त करें और फिर उसे ठीक से बंद करें यह बेकार है!

इसके चारों ओर सबसे अच्छा तरीका पैरामीटर नामों को इस तरह स्वैप करना है, और यह अभी भी काम करेगा:

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 से इस भयानक उत्तर की जांच करें





alias