यहाँ कुछ अच्छे उत्तर हैं, लेकिन मैं कुछ और बातें बताना चाहता था। फ़ंक्शन पैरामीटर वास्तव में एक जगह है जहां पावरशेल चमकता है। उदाहरण के लिए, आपके पास उन्नत कार्यों में या तो नाम या स्थितीय मानदंड हो सकते हैं:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
तब आप या तो पैरामीटर नाम निर्दिष्ट करके इसे कॉल कर सकते थे, या आप केवल स्थितीय मापदंडों का उपयोग कर सकते थे, क्योंकि आपने उन्हें स्पष्ट रूप से परिभाषित किया था। तो इनमें से कोई भी काम करेगा:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
पहला उदाहरण काम करता है भले ही Name
दूसरा प्रदान किया गया हो, क्योंकि हमने स्पष्ट रूप से पैरामीटर नाम का उपयोग किया है। दूसरा उदाहरण स्थिति के आधार पर काम करता है, इसलिए Name
पहले होना आवश्यक है। जब संभव हो, मैं हमेशा पदों को परिभाषित करने की कोशिश करता हूं ताकि दोनों विकल्प उपलब्ध हों।
PowerShell में पैरामीटर सेट को परिभाषित करने की क्षमता भी है। यह विधि अधिभार के स्थान पर इसका उपयोग करता है, और फिर से काफी उपयोगी है:
function Get-Something
{
[CmdletBinding(DefaultParameterSetName='Name')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
[string] $Name,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
[int] $Id
)
}
अब फ़ंक्शन या तो एक नाम लेगा, या एक आईडी, लेकिन दोनों नहीं। आप उन्हें स्थिति में या नाम से उपयोग कर सकते हैं। चूंकि वे एक अलग प्रकार के हैं, इसलिए PowerShell यह पता लगाएगा। तो ये सभी काम करेंगे:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
आप विभिन्न पैरामीटर सेट के लिए अतिरिक्त पैरामीटर भी असाइन कर सकते हैं। (यह स्पष्ट रूप से एक बहुत ही बुनियादी उदाहरण था।) फ़ंक्शन के अंदर, आप यह निर्धारित कर सकते हैं कि कौन सा पैरामीटर सेट $ PsCmdlet.ParameterSetName संपत्ति के साथ उपयोग किया गया था। उदाहरण के लिए:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
फिर, संबंधित पक्ष नोट पर, PowerShell में पैरामीटर सत्यापन भी है। यह मेरी पसंदीदा PowerShell सुविधाओं में से एक है, और यह आपके कार्यों के अंदर कोड को बहुत साफ करती है। आपके द्वारा उपयोग किए जा सकने वाले कई सत्यापन हैं। कुछ उदाहरण हैं:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
पहले उदाहरण में, ValidatePattern एक नियमित अभिव्यक्ति को स्वीकार करता है जो आपूर्ति किए गए पैरामीटर से आश्वासन देता है कि आप क्या अपेक्षा कर रहे हैं। यदि ऐसा नहीं होता है, तो एक सहज अपवाद को फेंक दिया जाता है, जो आपको बताता है कि क्या गलत है। तो उस उदाहरण में, 'समथिंग' ठीक काम करेगा, लेकिन 'समर' सत्यापन को पारित नहीं करेगा।
ValidateRange सुनिश्चित करता है कि पैरामीटर मान एक पूर्णांक के लिए अपेक्षित सीमा के बीच है। तो 10 या 99 काम करेगा, लेकिन 101 एक अपवाद फेंक देंगे।
एक अन्य उपयोगी वैलिडेटसेट है, जो आपको स्वीकार्य मूल्यों की एक सरणी को स्पष्ट रूप से परिभाषित करने की अनुमति देता है। यदि कुछ और दर्ज किया जाता है, तो एक अपवाद फेंक दिया जाएगा। वहाँ दूसरों के रूप में अच्छी तरह से कर रहे हैं, लेकिन शायद सबसे उपयोगी एक ValidateScript है। यह एक स्क्रिप्ट ब्लॉक लेता है जिसे $ सच्चे का मूल्यांकन करना चाहिए, इसलिए आकाश की सीमा है। उदाहरण के लिए:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
इस उदाहरण में, हमें केवल $ पथ मौजूद नहीं होने का आश्वासन दिया गया है, लेकिन यह एक फ़ाइल है, (जैसा कि एक निर्देशिका के विपरीत है और इसमें एक .csv एक्सटेंशन है। ($ _ पैरामीटर को संदर्भित करता है, जब आपके स्क्रिप्टब्लॉक के अंदर होता है।) यदि आप उस स्तर की आवश्यकता है, तो आप बहुत बड़े, मल्टी-लाइन स्क्रिप्ट ब्लॉक में भी पास कर सकते हैं या कई स्क्रिप्टब्लॉक का उपयोग कर सकते हैं जैसे मैंने यहां किया था। यह अत्यंत उपयोगी है और अच्छे स्वच्छ कार्यों और सहज अपवादों के लिए बनाता है।
Test "ABC" "DEF"