PowerShell
पॉवरशेल पाइपलाइन के साथ काम करना
खोज…
परिचय
PowerShell एक ऑब्जेक्ट पाइपलाइनिंग मॉडल का परिचय देता है, जो आपको कमांडलेट या कम से कम आउटपुट का उपभोग करने के लिए पाइपलाइन के माध्यम से पूरी वस्तुओं को नीचे भेजने की अनुमति देता है। शास्त्रीय स्ट्रिंग-आधारित पाइपलाइनिंग के विपरीत, पाइप्ड ऑब्जेक्ट्स में जानकारी विशिष्ट पदों पर नहीं होती है। कमांडलेट पाइप लाइन से इनपुट के रूप में वस्तुओं के साथ बातचीत करने की घोषणा कर सकते हैं, जबकि रिटर्न मान स्वचालित रूप से पाइपलाइन को भेजे जाते हैं।
वाक्य - विन्यास
- BEGIN पहला ब्लॉक। शुरुआत में एक बार एक्साइटेड। यहाँ पाइपलाइन इनपुट $ null है, क्योंकि इसे सेट नहीं किया गया है।
- प्रक्रिया दूसरा ब्लॉक। पाइपलाइन के प्रत्येक तत्व के लिए निष्पादित। पाइपलाइन पैरामीटर वर्तमान में संसाधित तत्व के बराबर है।
- अंतिम ब्लॉक। एक बार अंत में निष्पादित। पाइपलाइन पैरामीटर इनपुट के अंतिम तत्व के बराबर है, क्योंकि इसे सेट किए जाने के बाद से बदला नहीं गया है।
टिप्पणियों
ज्यादातर मामलों में, पाइपलाइन का इनपुट वस्तुओं का एक सरणी होगा। हालांकि के व्यवहार PROCESS{}
ब्लॉक के समान लग सकता है foreach{}
ब्लॉक, सरणी में एक तत्व लंघन एक अलग प्रक्रिया की आवश्यकता है।
अगर, foreach{}
, आपने PROCESS{}
ब्लॉक के अंदर continue
, तो यह END{}
ब्लॉक सहित सभी निम्नलिखित कथनों को छोड़ते हुए पाइपलाइन को तोड़ देगा। इसके बजाय, return
उपयोग करें - यह केवल वर्तमान तत्व के लिए PROCESS{}
ब्लॉक को समाप्त करेगा और अगले पर ले जाएगा।
कुछ मामलों में, विभिन्न एन्कोडिंग के साथ कार्यों के परिणाम को आउटपुट करने की आवश्यकता होती है। CmdLets के आउटपुट की एन्कोडिंग को $OutputEncoding
चर द्वारा नियंत्रित किया जाता है। जब आउटपुट को मूल अनुप्रयोगों में एक पाइपलाइन में डालने का इरादा होता है, तो लक्ष्य $OutputEncoding = [Console]::OutputEncoding
से मेल खाने के लिए एन्कोडिंग को ठीक करना एक अच्छा विचार हो सकता है $OutputEncoding = [Console]::OutputEncoding
अतिरिक्त संदर्भ:
$OutputEncoding
https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/ के बारे में अधिक जानकारी के साथ ब्लॉग लेख
उन्नत जीवनचक्र के साथ कार्य लेखन
यह उदाहरण दिखाता है कि कैसे एक फ़ंक्शन पाइपलाइन किए गए इनपुट को स्वीकार कर सकता है, और कुशलता से पुनरावृति कर सकता है।
ध्यान दें, कि begin
और end
समारोह के ढांचे वैकल्पिक जब pipelining रहे हैं, लेकिन है कि process
का उपयोग करते समय आवश्यक है ValueFromPipeline
या ValueFromPipelineByPropertyName
।
function Write-FromPipeline{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
$myInput
)
begin {
Write-Verbose -Message "Beginning Write-FromPipeline"
}
process {
Write-Output -InputObject $myInput
}
end {
Write-Verbose -Message "Ending Write-FromPipeline"
}
}
$foo = 'hello','world',1,2,3
$foo | Write-FromPipeline -Verbose
आउटपुट:
VERBOSE: Beginning Write-FromPipeline
hello
world
1
2
3
VERBOSE: Ending Write-FromPipeline
फंक्शंस में बेसिक पाइपलाइन सपोर्ट
यह पाइपलाइनिंग के लिए सबसे सरल संभव समर्थन के साथ एक फ़ंक्शन का एक उदाहरण है।
पाइपलाइन समर्थन के साथ किसी भी समारोह ParameterAttribute साथ कम से कम एक पैरामीटर होना आवश्यक है ValueFromPipeline
या ValueFromPipelineByPropertyName
जिन्हें आप नीचे देख, सेट।
function Write-FromPipeline {
param(
[Parameter(ValueFromPipeline)] # This sets the ParameterAttribute
[String]$Input
)
Write-Host $Input
}
$foo = 'Hello World!'
$foo | Write-FromPipeline
आउटपुट:
Hello World!
नोट: PowerShell 3.0 और इसके बाद के संस्करण में ParameterAttributes के लिए डिफ़ॉल्ट मान समर्थित हैं। पहले के संस्करणों में, आपको ValueFromPipeline=$true
निर्दिष्ट करना होगा।
पाइप लाइन की कार्य अवधारणा
एक पाइपलाइन श्रृंखला में प्रत्येक फ़ंक्शन समानांतर धागे की तरह, दूसरों के समानांतर चलता है। पहली संसाधित वस्तु अगले पाइपलाइन को प्रेषित की जाती है और अगले प्रसंस्करण को तुरंत दूसरे धागे में निष्पादित किया जाता है। यह मानक ForEach
की तुलना में उच्च गति लाभ की ForEach
@( bigFile_1, bigFile_2, ..., bigFile_n) | Copy-File | Encrypt-File | Get-Md5
- चरण - पहली फ़ाइल की
Copy-file
(Copy-file
थ्रेड में) - स्टेप - दूसरी फाइल को
Copy-file
(Copy-file
थ्रेड में) और साथ में पहलेEncrypt-File
(Encrypt-File
) - चरण - तीसरी फ़ाइल की
Copy-file
(Copy-file
थ्रेड में) और साथ में दूसरी फ़ाइलEncrypt-File
(इनक्रिप्टEncrypt-File
) और साथget-Md5
साथ पहले काGet-Md5
(Get-Md5
)