क्या जाने-माने PowerShell कोडिंग कन्वेंशन हैं?


18

PowerShell में प्रोग्रामिंग करते समय क्या कोई अच्छी तरह से परिभाषित परंपराएं हैं?

उदाहरण के लिए, ऐसी लिपियों में जिन्हें लंबे समय तक बनाए रखा जाना है, क्या हमें इसकी आवश्यकता है:

  • असली cmdlet नाम या उपनाम का उपयोग करें?
  • Cmdlet पैरामीटर नाम को पूर्ण या केवल आंशिक रूप से निर्दिष्ट करें ( dir -Recurseबनाम dir -r)
  • जब cmdlets के लिए स्ट्रिंग तर्क निर्दिष्ट करते हैं तो आप उन्हें उद्धरणों में संलग्न करते हैं ( New-Object 'System.Int32'बनामNew-Object System.Int32
  • फ़ंक्शन और फ़िल्टर लिखते समय क्या आप मापदंडों के प्रकार निर्दिष्ट करते हैं?
  • क्या आप (आधिकारिक) सही मामले में cmdlets लिखते हैं?
  • कीवर्ड को के लिए BEGIN...PROCESS...ENDआप उन्हें बड़े ही में लिख सकता हूँ?

ऐसा लगता है कि MSDN के पास PowerShell के लिए कोडिंग कन्वेंशन दस्तावेज़ की कमी है, जबकि C # के लिए इस तरह के दस्तावेज़ मौजूद हैं।




2
इस तरह के सम्मेलनों को प्रलेखित करने का प्रयास एक सामुदायिक परियोजना है। github.com/PoshCode/PowerShellP PracticeAndStyle । पाठ्यक्रम का विचरण है, शैली एक बहुत ही व्यक्तिगत चीज है।
क्रिस डेंट

जवाबों:


8

@ रोबर्ट हार्वे ने कुछ अच्छे औपचारिक लिंक का संदर्भ दिया। एक कम औपचारिक दस्तावेज के माध्यम से, मेरे विचार होंगे:

असली cmdlet नाम या उपनाम का उपयोग करें?

केवल उपनाम का उपयोग करें यदि यह पूर्ण नाम से अधिक स्पष्ट है। उदाहरण के लिए, मुझे लगता है कि ज्यादातर लोगों को पिछले अनुभव के आधार पर स्क्रिप्ट में dirया lsअधिक स्पष्ट मिलेगा Get-ChildItem(जैसे मूल रूप से कोई भी जो PowerShell स्क्रिप्ट लिख रहा है, उन दोनों में से कई बार डॉस बैच स्क्रिप्ट या यूनिक्स स्क्रिप्टिंग में से एक है)।

Cmdlet पैरामीटर नाम को पूर्ण या केवल आंशिक रूप से निर्दिष्ट करें (dir -Recurse बनाम dir -r)

एक स्क्रिप्ट में, मैं पूरी तरह से नाम लिख दूंगा क्योंकि (उपरोक्त उदाहरण के विपरीत) मैं उस समय के बारे में नहीं सोच सकता, जहां कम स्विच वास्तव में वर्तनी से अधिक स्पष्ट होगा। टाइपिंग को बचाने के लिए छोटे स्विच नाम हैं। एक कमांड लाइन पर, यह जरूरी है। एक स्क्रिप्ट में, अतिरिक्त कीस्ट्रोक्स पठनीयता और स्थिरता के लिए इसके लायक हैं।

जब cmdlets के लिए स्ट्रिंग तर्क निर्दिष्ट करते हैं, तो क्या आप उन्हें उद्धरणों में संलग्न करते हैं (नई-वस्तु 'System.Int32' बनाम नई-वस्तु System.Int32

कोड के माध्यम से पढ़ते समय उद्धरणों में स्ट्रिंग तर्क को और अधिक स्पष्ट लगता है, इसलिए मैं उन्हें शामिल करूंगा।

फ़ंक्शन और फ़िल्टर लिखते समय क्या आप मापदंडों के प्रकार निर्दिष्ट करते हैं?

केवल तभी जब दुभाषिया (जो होता है) के लिए अस्पष्टता को हल करने के लिए ऐसा करने की आवश्यकता है। यदि आप हर चीज पर कोशिश करने और टाइप करने जा रहे हैं, तो आप भी जा सकते हैं और C # कमांड लाइन एप्लिकेशन लिख सकते हैं (जो हमेशा एक बुरी बात नहीं है, लेकिन यह स्क्रिप्टिंग द्वारा आपके द्वारा प्राप्त की गई समय की बचत को नकार देता है)।

क्या आप (आधिकारिक) सही मामले में cmdlets लिखते हैं?

आपको चाहिए । मैं आमतौर पर करता हूं। जब मैं मामले में थोड़ा ढीला होने के लिए जाना जाता हूं, तो यह वाक्य-रचना के मामले में नहीं होता है।

BEGIN ... PROCESS ... END जैसे कीवर्ड के लिए आप उन्हें केवल अपरकेस में लिखते हैं?

नहीं, यह फोरट्रान नहीं है। मुझे लगता है कि ज्यादातर लोग इससे ज्यादा पढ़े लिखे beginया Beginज्यादा पढ़े लिखे हैं BEGIN। वहाँ एक कारण है कि हम सभी कैप को ऑनलाइन चिल्लाने के साथ जोड़ते हैं और कार्यक्रम के अधिकांश सांसारिक भागों को चिल्लाते हुए कम से कम मामलों पर किसी का ध्यान आकर्षित करके पठनीयता में बाधा डालते हैं।

मार्गदर्शक प्रिंसिपल की पठनीयता होनी चाहिए। त्वरित और गंदे कार्यक्रमों के रूप में उनके स्वभाव के अनुसार, राइट-ओनली कोड के लिए वीर। आपका हर निर्णय यह सुनिश्चित करने के लिए किया जाना चाहिए कि आप और आपकी टीम अभी भी छह महीने में स्क्रिप्ट को समझ सकें। अपने कोड को देखते हुए अपने आप को अपने खुद के जूते से बाहर निकालने की कोशिश करें और यह सवाल पूछें: "अगर मैंने एक हफ्ते पहले यह काम शुरू किया था (और इसलिए इसे सामान्य संस्कृति में वास्तव में प्रेरित नहीं किया गया था) तो क्या मुझे पता चलेगा कि यह किस तरह से लिखा गया है। या भ्रामक? "


2

Microsoft ने Cmdlet Development Guidelines का बहुत अच्छा सेट लिखा और प्रकाशित किया है

अंश:

इस खंड के विषय विकास दिशानिर्देश प्रदान करते हैं जिनका उपयोग आप अच्छी तरह से गठित cmdlets का उत्पादन करने के लिए कर सकते हैं। Windows PowerShell रनटाइम द्वारा प्रदान की गई सामान्य कार्यक्षमता और इन दिशानिर्देशों का पालन करके, आप न्यूनतम प्रयास के साथ मजबूत cmdlets विकसित कर सकते हैं और उपयोगकर्ता को एक सुसंगत अनुभव प्रदान कर सकते हैं। इसके अतिरिक्त, आप परीक्षण के बोझ को कम कर देंगे क्योंकि सामान्य कार्यक्षमता को रिटायरिंग की आवश्यकता नहीं है।

इस अनुभाग में

ये दिशानिर्देश किसी भी भाषा तक सीमित नहीं हैं (वे एक भाषा का उल्लेख नहीं करते हैं), और पावरशेल में Cmdlets लिखते समय पूरी तरह से लागू होते हैं।

इन दिशानिर्देशों का उपयोग करने से आपको स्पष्ट, खोज योग्य, प्रयोग करने योग्य और पुन: प्रयोज्य Cmdlets लिखने में मदद मिलेगी। मुझे लगता है कि इन दिशानिर्देशों का पालन करने के बाद कई PowerShell मॉड्यूल बनाना मुश्किल नहीं है, और इससे मुझे एक बेहतर PowerShell डेवलपर बनने में मदद मिली। सरल स्क्रीप्ट लिखने के साथ ही यह कौशल सीधे प्रयोग करने योग्य है।


1
ये कैसे PowerShell लिखने के बजाय cmdlets लिखने के बारे में अधिक लगता है।
फिलिप केंडल

@PhilipKendall वे वास्तव में करते हैं। यह पूर्ण प्रश्न का उत्तर नहीं दे सकता है, लेकिन मुझे विश्वास है कि यह प्रश्न के लिए मूल्य जोड़ता है। ध्यान दें कि आप अपने Cmdlets को पूरी तरह से शुद्ध PowerShell में लिख सकते हैं, और ये दिशा-निर्देश वास्तव में उसी के साथ मदद करते हैं। यदि आप PowerShell में एक अच्छा Cmdlet लिख सकते हैं, तो आप अच्छी PowerShell स्क्रिप्ट भी लिख सकते हैं।
oɔɯǝɹ

1

दूसरे उत्तर के रूप में; आप अपने कोड को मान्य करने के लिए PSScriptAnalyzer मॉड्यूल का उपयोग कर सकते हैं ।

Invoke-ScriptAnalyzer -Path .

यह एक नियम का उपयोग करके कोड विश्लेषण पर आधारित है। यह कोड डिज़ाइन को मान्य करेगा, और आपको अपने कोड में कई छोटे मुद्दों का पता लगाने में मदद करेगा।

डिजाइन और गुणवत्ता के मुद्दों को पकड़ने के लिए हमने इसे अपने बिल्ड्स में शामिल किया है (हम मॉड्यूल के लिए बिल्ड और एक निजी भंडार का उपयोग करते हैं)।

यदि आप रुचि रखते हैं, तो इस मॉड्यूल में एक PowerShell कोड फ़ॉर्मेटर (जिसमें कई शैलियों का उपयोग किया जा सकता है) शामिल हैं, इसलिए आप कोड लेआउट को मानकीकृत करने के लिए भी इसका उपयोग कर सकते हैं।


0

@ 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। मैं एक स्क्रिप्ट की खोज के बारे में चिंतित नहीं हूं जो एक कार्यक्रम के रूप में चलता है और यह बहुत ही स्वभाव से मॉड्यूलर होने का इरादा नहीं है।

  • अधिक पठनीय, अधिक ठोस, या अधिक रख-रखाव करने पर नियमों को तोड़ें।


-3

वर्षों से चर, कार्यों आदि के लिए बहु-शब्द नाम लिखने के कई तरीके हैं।

PROGRAMFORSORTINGLOTSOFTHINGS को पढ़ना मुश्किल है।

PROGRAM_FOR_SORTING_LOTS_OF_THINGS थोड़ा आसान है।

program_for_sorting_lots_of_things अभी तक आसान है।

ProgramForSortingLotsOfThings अंडरस्कोर के साथ दूर करता है और पठनीयता को बनाए रखता है। Powershell यह सबसे अधिक के लिए करता है।


पॉवर्सशेल में आमतौर पर ऊंट आवरण का मिश्रण होता है (जो वाक्य रचना का कोई मतलब नहीं है) और डैश। उदाहरण के लिए, Get-ChildItemक्रिया और संज्ञा के बीच एक डैश के साथ।
एंड्रयू का कहना है कि मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.