@ O documents के उत्तर में दस्तावेज़ एक अच्छा है, अगर कुछ हद तक मूर्त स्रोत हैं।
यदि आप विजुअल स्टूडियो कोड का उपयोग करते हैं, जो कि एजिंग पावरशेल आईएसई को बदलने की योजना है, और फिर वीएस कोड पावरस्ले एक्सटेंशन स्थापित करें , जिसमें कई स्वरूपण विकल्प शामिल हैं जो कम से कम आंशिक रूप से अनऑफिशियल पावरशैल बेस्ट प्रैक्टिस और स्टाइल गाइड पर आधारित थे । VS कोड और पावरशेल एक्सटेंशन दोनों को Microsoft द्वारा प्रबंधित किया जाता है, इसलिए यह एक अनौपचारिक गाइड के रूप में आधिकारिक हो सकता है।
मैं उनकी हर बात से सहमत नहीं हूं। उदाहरण के लिए, मैं PHP, Java, C #, और SQL से आता हूँ जहाँ आवश्यक नहीं होने पर अर्धविराम की अपेक्षा की जाती है। उनके बिना कोड मुझे गलत लगता है , इसलिए मैं उन्हें शामिल करता हूं। यदि #requires SemicolonTerminator
मैं अपनी अधिकांश लिपियों पर इसे सक्षम कर देता, तो मुझे व्हाट्सएप को लाइन तोड़ने की चिंता नहीं करनी पड़ती। मैं कैरिज रिटर्न और अन्य वीबी-आइम्स से बचने से नफरत करता हूं।
बाकी ये मेरी राय हैं:
असली cmdlet नाम या उपनाम का उपयोग करें?
असंदिग्ध हो। सहेजे गए स्क्रिप्ट में कभी भी अन्य का उपयोग न करें; यहां तक कि एक डिफ़ॉल्ट उपनाम। उपयोगकर्ता को डिफ़ॉल्ट उपनाम बदलने से कुछ भी नहीं रोक रहा है। यह मान लेना सुरक्षित है कि वे अपरिवर्तनीय नहीं हैं।
Cmdlet पैरामीटर नाम को पूर्ण या केवल आंशिक रूप से निर्दिष्ट करें (dir -Recurse बनाम dir -r)
फिर, असंदिग्ध हो। पूर्ण पैरामीटर नाम में सबसे अच्छा संगतता है। -r
आज असंदिग्ध हो सकता है, लेकिन नए मापदंडों को शुरू करने से एक कमांड के भविष्य के संस्करणों को रोकना कुछ भी नहीं है। आप एक IDE (ISE या VS कोड) का उपयोग करने जा रहे हैं। उस पैरामीटर को हिट Ctrl+ Spaceऔर स्वतः पूर्ण करें।
ध्यान दें कि ls -r
है अस्पष्ट। -ReadOnly
का एक और पैरामीटर है Get-ChildItem
।
जब cmdlets के लिए स्ट्रिंग तर्क निर्दिष्ट करते हैं, तो क्या आप उन्हें उद्धरणों में संलग्न करते हैं (नई-वस्तु 'System.Int32' बनाम नई-वस्तु System.Int32
सामान्य तौर पर, जब आवश्यक हो तभी उद्धरणों का उपयोग किया जाना चाहिए (जैसे, New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'
जब आप कर सकते हैं तो एकल उद्धरणों का उपयोग करें, और केवल दोहरे उद्धरण चिह्नों का उपयोग करें जब आपको एकल उद्धरणों को एनकोड करने की आवश्यकता हो या चर को एम्बेड करने की आवश्यकता हो।
फ़ंक्शन और फ़िल्टर लिखते समय क्या आप मापदंडों के प्रकार निर्दिष्ट करते हैं?
मैं आमतौर पर करता हूं, जब तक कि मुझे विशेष रूप से एक ही पैरामीटर के साथ विभिन्न प्रकारों को स्वीकार करने की आवश्यकता नहीं है और व्यक्तिगत पैरामीटर सेट लिखना नहीं चाहते हैं।
क्या आप (आधिकारिक) सही मामले में cmdlets लिखते हैं?
पास्कल का मामला। हाँ।
BEGIN ... PROCESS ... END जैसे कीवर्ड के लिए आप उन्हें केवल अपरकेस में लिखते हैं?
मैं के रूप में बयान, ऑपरेटर, और भाषा निर्माणों को देखा है Begin
, If
, ForEach
, -NotIn
के साथ-साथ begin
, if
, foreach
, -notin
। व्यक्तिगत रूप से, मैं लोअर केस पसंद करता हूं और कमांड्स को पास्कल केस के रूप में छोड़ता हूं, लेकिन वे दोनों समान रूप से सामान्य हैं।
अन्य:
हमेशा पैरामीटर निर्दिष्ट करें। स्थिति आदेश पर भरोसा मत करो। New-Object -TypeName System.Int32
खत्म हो गया New-Object System.Int32
। मुझे नहीं पता कि क्या इस पर सहमति है, लेकिन, फिर, यह "असंदिग्ध होना" के सामान्य विचार का समर्थन करता है।
यदि मैं एक मॉड्यूल लिख रहा हूं, तो मैं संकेतित मानक क्रियाओं का उपयोग करता हूं Get-Verb
। हालांकि, यह सूची बेहद संकीर्ण है, इसलिए स्क्रिप्ट के लिए स्टैंड-अलोन स्क्रिप्ट नाम जो केवल मैं खुद चलाऊंगा वह अक्सर नहीं होता है। जेनेरिक क्रिया सूची के साथ समस्या यह है कि यह अंदर की ओर झुक जाती है Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1
। अगर मैं एक ऐसी स्क्रिप्ट लिख रहा हूं, जो एक पीडीएफ फाइल से कुछ पेज निकालती है, तो मैं उसे कॉल नहीं कर रहा हूं Get-ExtractedAccountPDFPages.ps1
। मैं इसे बुला रहा हूं Extract-AccountPDFPages.ps1
। मैं एक स्क्रिप्ट की खोज के बारे में चिंतित नहीं हूं जो एक कार्यक्रम के रूप में चलता है और यह बहुत ही स्वभाव से मॉड्यूलर होने का इरादा नहीं है।
अधिक पठनीय, अधिक ठोस, या अधिक रख-रखाव करने पर नियमों को तोड़ें।