PowerShell
पॉवरशेल फ़ंक्शंस
खोज…
परिचय
एक फ़ंक्शन मूल रूप से कोड का एक नामित ब्लॉक है। जब आप फ़ंक्शन का नाम कहते हैं, तो उस फ़ंक्शन के भीतर स्क्रिप्ट ब्लॉक चलता है। यह PowerShell कथनों की एक सूची है जिसका एक नाम है जिसे आप असाइन करते हैं। जब आप कोई फ़ंक्शन चलाते हैं, तो आप फ़ंक्शन का नाम टाइप करते हैं। यह दोहराए जाने वाले कार्यों से निपटने के समय को बचाने का एक तरीका है। PowerShell तीन भागों में स्वरूपित करता है: कीवर्ड 'फ़ंक्शन', उसके बाद नाम, अंत में, स्क्रिप्ट ब्लॉक वाले पेलोड, जो घुंघराले / कोष्ठक शैली ब्रैकेट द्वारा संलग्न है।
कोई पैरामीटर के साथ सरल कार्य
यह एक फ़ंक्शन का एक उदाहरण है जो एक स्ट्रिंग लौटाता है। उदाहरण में, फ़ंक्शन को वैरिएबल के लिए मान निर्दिष्ट करने वाले स्टेटमेंट में कहा जाता है। इस मामले में मान फ़ंक्शन का रिटर्न मान है।
function Get-Greeting{
"Hello World"
}
# Invoking the function
$greeting = Get-Greeting
# demonstrate output
$greeting
Get-Greeting
function
निम्नलिखित कोड को एक function
घोषित करता है।
Get-Greeting
फ़ंक्शन का नाम है। किसी भी समय फ़ंक्शन को स्क्रिप्ट में उपयोग करने की आवश्यकता होती है, फ़ंक्शन को नाम से इसे लागू करने के माध्यम से बुलाया जा सकता है।
{ ... }
स्क्रिप्ट ब्लॉक है जिसे फ़ंक्शन द्वारा निष्पादित किया जाता है।
यदि उपरोक्त कोड को ISE में निष्पादित किया जाता है, तो परिणाम कुछ इस तरह होंगे:
Hello World
Hello World
बेसिक पैरामीटर
एक फ़ंक्शन को पैराम ब्लॉक का उपयोग करके मापदंडों के साथ परिभाषित किया जा सकता है:
function Write-Greeting {
param(
[Parameter(Mandatory,Position=0)]
[String]$name,
[Parameter(Mandatory,Position=1)]
[Int]$age
)
"Hello $name, you are $age years old."
}
या साधारण फ़ंक्शन सिंटैक्स का उपयोग करना:
function Write-Greeting ($name, $age) {
"Hello $name, you are $age years old."
}
नोट: किसी भी प्रकार की पैरामीटर परिभाषा में कास्टिंग मापदंडों की आवश्यकता नहीं है।
साधारण फ़ंक्शन सिंटैक्स (SFS) में परम ब्लॉक की तुलना में बहुत सीमित क्षमताएं हैं।
यद्यपि आप फ़ंक्शन के भीतर उजागर होने वाले मापदंडों को परिभाषित कर सकते हैं, आप पैरामीटर गुण निर्दिष्ट नहीं कर सकते, पैरामीटर सत्यापन का उपयोग कर सकते हैं, जिसमें [CmdletBinding()]
, SFS के साथ (और यह एक गैर-थकाऊ सूची है)।
आदेशों या नामित मापदंडों के साथ कार्यों को लागू किया जा सकता है।
मंगलाचरण पर मापदंडों के क्रम को फ़ंक्शन हेडर (डिफ़ॉल्ट रूप से) में घोषणा के क्रम से मिलान किया जाता है, या Position
पैरामीटर विशेषता का उपयोग करके निर्दिष्ट किया जा सकता है (जैसा कि उन्नत फ़ंक्शन उदाहरण में दिखाया गया है, ऊपर)।
$greeting = Write-Greeting "Jim" 82
वैकल्पिक रूप से, इस फ़ंक्शन को नामित मापदंडों के साथ लागू किया जा सकता है
$greeting = Write-Greeting -name "Bob" -age 82
अनिवार्य पैरामीटर
किसी फ़ंक्शन के पैरामीटर को अनिवार्य के रूप में चिह्नित किया जा सकता है
function Get-Greeting{
param
(
[Parameter(Mandatory=$true)]$name
)
"Hello World $name"
}
यदि फ़ंक्शन बिना मान के लागू होता है, तो कमांड लाइन मान के लिए संकेत देगा:
$greeting = Get-Greeting
cmdlet Get-Greeting at command pipeline position 1
Supply values for the following parameters:
name:
उन्नत कार्य
यह Powershell ISE से उन्नत फ़ंक्शन स्निपेट की एक प्रति है। मूल रूप से यह कई चीजों के लिए एक टेम्प्लेट है जो आप पॉवर्सशेल में उन्नत कार्यों के साथ उपयोग कर सकते हैं। नोट करने के लिए मुख्य बिंदु:
- गेट-हेल्प इंटीग्रेशन - फ़ंक्शन की शुरुआत में एक टिप्पणी ब्लॉक होता है जिसे गेट-हेल्प cmdlet द्वारा पढ़ा जाता है। यदि वांछित हो, तो फ़ंक्शन ब्लॉक अंत में स्थित हो सकता है।
- cmdletbinding - फ़ंक्शन एक cmdlet की तरह व्यवहार करेगा
- मापदंडों
- पैरामीटर सेट
<#
.Synopsis
Short description
.DESCRIPTION
Long description
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function Verb-Noun
{
[CmdletBinding(DefaultParameterSetName='Parameter Set 1',
SupportsShouldProcess=$true,
PositionalBinding=$false,
HelpUri = 'http://www.microsoft.com/',
ConfirmImpact='Medium')]
[Alias()]
[OutputType([String])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=0,
ParameterSetName='Parameter Set 1')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[ValidateCount(0,5)]
[ValidateSet("sun", "moon", "earth")]
[Alias("p1")]
$Param1,
# Param2 help description
[Parameter(ParameterSetName='Parameter Set 1')]
[AllowNull()]
[AllowEmptyCollection()]
[AllowEmptyString()]
[ValidateScript({$true})]
[ValidateRange(0,5)]
[int]
$Param2,
# Param3 help description
[Parameter(ParameterSetName='Another Parameter Set')]
[ValidatePattern("[a-z]*")]
[ValidateLength(0,15)]
[String]
$Param3
)
Begin
{
}
Process
{
if ($pscmdlet.ShouldProcess("Target", "Operation"))
{
}
}
End
{
}
}
पैरामीटर सत्यापन
PowerShell में पैरामीटर प्रविष्टि को मान्य करने के कई तरीके हैं।
पैरामीटर मानों को मान्य करने के लिए फ़ंक्शन या स्क्रिप्ट के भीतर कोड लिखने के बजाय, ये पैरामीटर पैरामीटर अमान्य मानों को पारित करने पर फेंक देंगे।
ValidateSet
कभी-कभी हमें उन संभावित मूल्यों को प्रतिबंधित करने की आवश्यकता होती है जो एक पैरामीटर स्वीकार कर सकता है। मान लें कि हम स्क्रिप्ट या फ़ंक्शन में $Color
पैरामीटर के लिए केवल लाल, हरे और नीले रंग की अनुमति देना चाहते हैं।
इसे प्रतिबंधित करने के लिए हम ValidateSet
पैरामीटर विशेषता का उपयोग कर सकते हैं। इस तर्क को (कुछ वातावरण में) सेट करते समय टैब को पूरा करने की अनुमति देने का अतिरिक्त लाभ है।
param(
[ValidateSet('red','green','blue',IgnoreCase)]
[string]$Color
)
केस संवेदनशीलता को अक्षम करने के लिए आप IgnoreCase
को भी निर्दिष्ट कर सकते हैं।
ValidateRange
पैरामीटर सत्यापन की यह विधि एक मिनट और अधिकतम Int32 मान लेती है, और उस सीमा के भीतर पैरामीटर की आवश्यकता होती है।
param(
[ValidateRange(0,120)]
[Int]$Age
)
ValidatePattern
पैरामीटर सत्यापन की यह विधि निर्दिष्ट पैरामीटर को स्वीकार करती है जो निर्दिष्ट रेगेक्स पैटर्न से मेल खाती है।
param(
[ValidatePattern("\w{4-6}\d{2}")]
[string]$UserName
)
ValidateLength
पैरामीटर सत्यापन की यह विधि पारित स्ट्रिंग की लंबाई का परीक्षण करती है।
param(
[ValidateLength(0,15)]
[String]$PhoneNumber
)
ValidateCount
पैरामीटर सत्यापन की यह विधि पारित तर्कों की मात्रा का परीक्षण करती है, उदाहरण के लिए, तार की एक सरणी।
param(
[ValidateCount(1,5)]
[String[]]$ComputerName
)
ValidateScript
अंत में, ValidateScript विधि असाधारण रूप से लचीली है, एक स्क्रिप्टब्लॉक ले रही है और पारित तर्क का प्रतिनिधित्व करने के लिए $ _ का उपयोग करके इसका मूल्यांकन कर रही है। यह तब तर्क को पारित करता है यदि परिणाम $ सत्य है (किसी भी आउटपुट को मान्य के रूप में)।
इसका उपयोग यह परीक्षण करने के लिए किया जा सकता है कि कोई फ़ाइल मौजूद है:
param(
[ValidateScript({Test-Path $_})]
[IO.FileInfo]$Path
)
यह जाँचने के लिए कि कोई उपयोगकर्ता AD में मौजूद है:
param(
[ValidateScript({Get-ADUser $_})]
[String]$UserName
)
और बहुत कुछ आप लिख सकते हैं (जैसा कि यह oneliners तक सीमित नहीं है):
param(
[ValidateScript({
$AnHourAgo = (Get-Date).AddHours(-1)
if ($_ -lt $AnHourAgo.AddMinutes(5) -and $_ -gt $AnHourAgo.AddMinutes(-5)) {
$true
} else {
throw "That's not within five minutes. Try again."
}
})]
[String]$TimeAboutAnHourAgo
)