PowerShell, Unix के गोले के समान सतही है। PowerShell में आपके द्वारा यूनिक्स में उपयोग की जाने वाली कई कमांड्स जैसे कि ls, rm, cp, mv, इत्यादि के लिए उपनाम हैं। हालाँकि, जिस तरह से उपनामों के पीछे cmdlets काम करते हैं वह बिल्कुल अलग है।
* निक्स शेल में, सब कुछ टेक्स्ट आधारित है, इसलिए एक कमांड से आउटपुट को दूसरे से पाइप किया जा सकता है, लेकिन प्राप्त कार्यक्रम को पता होना चाहिए कि पाइप लाइन से टेक्स्ट को पार्स / व्याख्या कैसे करें। यह PowerShell और * nix के गोले के बीच मुख्य अंतर है ... PowerShell में, जो कुछ भी पास होता है वह एक वस्तु है।
इसका परिणाम यह है कि एक कमांड से दूसरे कमांड में पाइपिंग केवल स्टडआउट को स्टड करने के लिए पाइपिंग नहीं है। यह रिसीवर के लिए एक पूर्ण .net वस्तु पाइपिंग है। इसलिए, रिसीवर को बस यह जानना होगा कि उस प्रकार के ऑब्जेक्ट को कैसे संभालना है। इसे पाठ के किसी भी पार्सिंग को लागू करने की आवश्यकता नहीं है, लेकिन यह समझने की आवश्यकता है कि इनपुट ऑब्जेक्ट के तरीकों और गुणों (सदस्यों) को कैसे कॉल किया जाए।
* Nix कमांड लाइन प्रोग्राम में, आप कोड लिखेंगे जो स्टड से पढ़ता है और उत्पन्न पाठ से इसकी जानकारी को पार्स करता है। PowerShell में, आप ऐसा कुछ करेंगे:
function changeName($myObject)
{
if ($myObject.GetType() -eq [MyType])
{
#print the current name to screen
$myObject.Name
#change string in the 'name' property
$myObject.Name = "NewName"
}
return $myObject
}
इस कोड को कमांड लाइन पर कॉल करने पर ऐसा लग सकता है:
PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName
आप पाइपिंग तंत्र का उपयोग करते हुए ऊपर भी ऐसा ही कर सकते हैं, लेकिन आप यहां प्रमुख अंतर देख सकते हैं कि हम एक वस्तु को पारित कर रहे हैं और न कि:
PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName
इस बड़े अंतर को भूलकर, मैं कहूंगा कि अन्य सतही समानताएं हैं, लेकिन ज्यादातर सिर्फ वाक्यात्मक हैं। लगता है कि PowerShell सिंटैक्स को * nix शेल यूजर्स को ध्यान में रखकर बनाया गया है, इसलिए बहुत सारी भाषा शैली समान है।