มีอนุสัญญาการเข้ารหัส PowerShell ที่รู้จักกันดีหรือไม่?


18

มีการประชุมที่กำหนดชัดเจนเมื่อเขียนโปรแกรมใน PowerShell หรือไม่

ตัวอย่างเช่นในสคริปต์ที่ต้องดูแลรักษาในระยะยาวเราจำเป็นต้อง:

  • ใช้ชื่อจริงหรือชื่อแทน cmdlet หรือไม่
  • ระบุชื่อพารามิเตอร์ cmdlet เต็มหรือบางส่วนเท่านั้น ( dir -Recurseเทียบกับdir -r)
  • เมื่อระบุอาร์กิวเมนต์สายอักขระสำหรับ cmdlet คุณจะใส่อาร์กิวเมนต์ในเครื่องหมายคำพูด ( New-Object 'System.Int32'กับ)New-Object System.Int32
  • เมื่อคุณเขียนฟังก์ชั่นและตัวกรองคุณระบุประเภทของพารามิเตอร์หรือไม่
  • คุณเขียน cmdlets ในกรณีที่ถูกต้อง (เป็นทางการ) หรือไม่?
  • สำหรับคำหลักเช่นBEGIN...PROCESS...ENDคุณเขียนเป็นตัวพิมพ์ใหญ่เท่านั้นหรือไม่

ดูเหมือนว่า MSDN ไม่มีเอกสารการประชุมการเข้ารหัสสำหรับ PowerShell ในขณะที่เอกสารดังกล่าวมีอยู่เช่นสำหรับ C #




2
มีโครงการชุมชนที่พยายามจัดทำเอกสารการประชุมดังกล่าว github.com/PoshCode/PowerShellPracticeAndStyle มีความแปรปรวนแน่นอนสไตล์เป็นเรื่องส่วนตัวมาก
คริสเดนท์

คำตอบ:


8

@ Robert Harvey อ้างอิงถึงลิงค์ที่เป็นทางการที่ดี จากเอกสารที่เป็นทางการน้อยกว่าความคิดของฉันจะเป็น:

ใช้ชื่อจริงหรือชื่อแทน cmdlet หรือไม่

ใช้นามแฝงหากชัดเจนกว่าชื่อเต็ม ตัวอย่างเช่นฉันคิดว่าคนส่วนใหญ่จะพบdirหรือlsชัดเจนในสคริปต์มากกว่าGet-ChildItemจากประสบการณ์ก่อนหน้า (เช่นโดยทั่วไปใครก็ตามที่เขียนสคริปต์ PowerShell มีหนึ่งในสองคนเหล่านี้หลายครั้งในชุดสคริปต์ DOS หรือสคริปต์ Unix)

ระบุชื่อพารามิเตอร์ cmdlet เป็นแบบเต็มหรือบางส่วนเท่านั้น (dir -Recurse กับ dir -r)

ในบทที่ผมได้อย่างเต็มที่จะสะกดออกชื่อเพราะ (เหมือนตัวอย่างข้างต้น) ฉันไม่สามารถคิดของเวลาที่สวิทช์สั้นจริงจะเป็นมากขึ้นชัดเจนกว่าการสะกดมันออกมา ชื่อสวิตช์ที่สั้นกว่านั้นเพื่อบันทึกการพิมพ์ ที่บรรทัดรับคำสั่งสิ่งนี้มีความจำเป็น ในสคริปต์การกดแป้นพิเศษนั้นคุ้มค่าสำหรับการอ่านและการบำรุงรักษา

เมื่อระบุอาร์กิวเมนต์สตริงสำหรับ cmdlets คุณใส่คำพูดไว้ในเครื่องหมายคำพูด (New-Object 'System.Int32' กับ New-Object System.Int32

การใส่อาร์กิวเมนต์สตริงในเครื่องหมายคำพูดนั้นชัดเจนยิ่งขึ้นเมื่ออ่านโค้ดดังนั้นฉันจะรวมมันไว้ด้วย

เมื่อคุณเขียนฟังก์ชั่นและตัวกรองคุณระบุประเภทของพารามิเตอร์หรือไม่

เฉพาะเมื่อมีความจำเป็นต้องทำเช่นนั้นเพื่อแก้ไขความกำกวมของล่าม (ซึ่งเกิดขึ้น) หากคุณกำลังจะลองและวางประเภทกับทุกสิ่งคุณก็อาจไปและเขียนแอปพลิเคชันบรรทัดคำสั่ง C # (ซึ่งไม่ได้เป็นเรื่องเลวร้ายเสมอไป

คุณเขียน cmdlets ในกรณีที่ถูกต้อง (เป็นทางการ) หรือไม่?

คุณควร ฉันมักจะทำ เมื่อฉันรีบฉันเป็นที่รู้จักกันดีในกรณีเล็ก ๆ น้อย ๆ เพราะมันไม่สำคัญเรื่อง syntactically

สำหรับคำหลักเช่น BEGIN ... กระบวนการ ... END คุณเขียนด้วยตัวพิมพ์ใหญ่เท่านั้นหรือไม่

ไม่นี่ไม่ใช่ FORTRAN ผมคิดว่าคนส่วนใหญ่พบbeginหรืออ่านได้มากขึ้นกว่าBegin BEGINมีเหตุผลที่เราเชื่อมโยงตัวพิมพ์ใหญ่ทั้งหมดกับการตะโกนออนไลน์และตะโกนส่วนที่เป็นทางโลกมากที่สุดของโปรแกรมขัดขวางการอ่านได้โดยการดึงความสนใจไปยังส่วนที่มีความสำคัญน้อยที่สุด

หลักการที่แนะนำควรอ่านได้ง่าย สคริปต์โดยปกติแล้วโปรแกรมที่รวดเร็วและสกปรกจะเปลี่ยนไปใช้โค้ดแบบเขียนอย่างเดียว การตัดสินใจทุกครั้งของคุณควรทำเพื่อให้แน่ใจว่าคุณและทีมของคุณยังสามารถเข้าใจสคริปต์ในหกเดือน ลองแยกตัวเองออกจากรองเท้าของคุณเมื่อมองไปที่รหัสของคุณและถามคำถามนี้ว่า: "ถ้าฉันเริ่มงานนี้เมื่อสัปดาห์ก่อน หรือสับสน? "


2

Microsoft ได้เขียนและเผยแพร่ชุดแนวทางการพัฒนา Cmdletที่ดีมาก

ข้อความที่ตัดตอนมา:

หัวข้อในส่วนนี้มีแนวทางการพัฒนาที่คุณสามารถใช้เพื่อสร้าง cmdlet ที่มีรูปแบบที่ดี ด้วยการใช้ประโยชน์จากฟังก์ชั่นทั่วไปที่ได้รับจาก Windows PowerShell runtime และโดยทำตามคำแนะนำเหล่านี้คุณสามารถพัฒนา cmdlet ที่แข็งแกร่งได้โดยใช้ความพยายามน้อยที่สุดและมอบประสบการณ์ที่สอดคล้องให้กับผู้ใช้ นอกจากนี้คุณจะลดภาระในการทดสอบเนื่องจากการทำงานทั่วไปไม่จำเป็นต้องมีการทดสอบซ้ำ

ในส่วนนี้

แนวทางเหล่านี้ไม่ได้ จำกัด อยู่ที่ภาษาใด ๆ (ไม่ได้พูดถึงภาษาใด ๆ ) และใช้ได้อย่างสมบูรณ์แบบเมื่อเขียน Cmdlets ใน PowerShell

การใช้แนวทางเหล่านี้จะช่วยให้คุณเขียน Cmdlets ชัดเจนค้นหาได้ใช้งานได้และนำมาใช้ซ้ำได้ ฉันพบว่าหลังจากสร้างโมดูล PowerShell หลายตัวโดยปฏิบัติตามแนวทางเหล่านี้ไม่ยากและช่วยให้ฉันเป็นนักพัฒนา PowerShell ที่ดีขึ้น ทักษะนั้นใช้งานได้โดยตรงเมื่อเขียนสคริปต์อย่างง่ายเช่นกัน


1
สิ่งเหล่านี้ดูเหมือนจะเกี่ยวกับวิธีเขียน cmdlet มากกว่าที่จะเขียน PowerShell
Philip Kendall

@PhilipKendall พวกเขาทำแน่นอน สิ่งนี้อาจไม่ตอบคำถามที่สมบูรณ์ แต่ฉันเชื่อว่านี่จะเป็นการเพิ่มคุณค่าให้กับคำถาม โปรดทราบว่าคุณสามารถเขียน Cmdlets ของคุณได้อย่างสมบูรณ์ใน PowerShell ล้วนๆและแนวทางเหล่านี้ก็ช่วยได้เช่นกัน หากคุณสามารถเขียน Cmdlet ที่ดีใน PowerShell ได้ดีกว่าที่คุณสามารถเขียนสคริปต์ PowerShell ที่ดีเช่นกัน
oɔɯǝɹ

1

เป็นคำตอบที่สอง; คุณสามารถใช้โมดูลPSScriptAnalyzerเพื่อตรวจสอบรหัสของคุณ

Invoke-ScriptAnalyzer -Path .

มันขึ้นอยู่กับการวิเคราะห์รหัสโดยใช้ ruleset มันจะตรวจสอบการออกแบบรหัสและจะช่วยให้คุณตรวจสอบปัญหาเล็ก ๆ น้อย ๆ ในรหัสของคุณ

เรารวมไว้ในงานสร้างของเรา (เราใช้งานสร้างและที่เก็บส่วนตัวสำหรับโมดูล) เพื่อตรวจจับปัญหาการออกแบบและคุณภาพ

หากคุณสนใจโมดูลนี้ยังมีการจัดรูปแบบรหัส PowerShell (ซึ่งสามารถใช้หลายสไตล์) ดังนั้นคุณสามารถใช้เพื่อจัดรูปแบบรหัสมาตรฐานได้เช่นกัน


0

เอกสารในคำตอบของ @ oɔɯǝɹนั้นดีถ้าแหล่งที่มาที่สัมพัทธ์ค่อนข้าง

หากคุณใช้ Visual Studio รหัสซึ่งมีการวางแผนที่จะแทนที่ริ้วรอย PowerShell ISE แล้วติดตั้งส่วนขยาย VS รหัส PowerShellที่มีตัวเลือกการจัดรูปแบบหลายอย่างที่เป็นอย่างน้อยบางส่วนขึ้นอยู่กับทางการ PowerShell ปฏิบัติที่ดีที่สุดและคู่มือสไตล์ ทั้ง VS Code และส่วนขยาย PowerShell ได้รับการจัดการโดย Microsoft ดังนั้นจึงเป็นเรื่องเกี่ยวกับแนวทางทางการที่ไม่เป็นทางการ

ฉันไม่เห็นด้วยกับทุกสิ่งที่พวกเขาระบุ ตัวอย่างเช่นฉันมาจาก PHP, Java, C # และ SQL ที่คาดว่าจะใช้เครื่องหมายอัฒภาคหากไม่จำเป็น รหัสดูเหมือนผิดกับฉันหากไม่มีพวกเขาดังนั้นฉันจึงรวมมัน หากมี#requires SemicolonTerminatorฉันจะเปิดใช้งานในส่วนใหญ่ของสคริปต์ของฉันดังนั้นฉันไม่ต้องกังวลเกี่ยวกับช่องว่างแบ่งบรรทัด ฉันเกลียดการหลบกลับจากการขึ้นบรรทัดใหม่และ VB-isms อื่น ๆ

ส่วนที่เหลือเป็นความคิดเห็นของฉัน:

ใช้ชื่อจริงหรือชื่อแทน cmdlet หรือไม่

จะไม่คลุมเครือ อย่าใช้นามแฝงในสคริปต์ที่บันทึกไว้ แม้กระทั่งนามแฝงเริ่มต้น ไม่มีอะไรหยุดผู้ใช้จากการเปลี่ยนนามแฝงเริ่มต้น มันปลอดภัยกว่าที่จะคิดว่าพวกมันไม่เปลี่ยนรูป

ระบุชื่อพารามิเตอร์ cmdlet เป็นแบบเต็มหรือบางส่วนเท่านั้น (dir -Recurse กับ dir -r)

อีกครั้งไม่ต้องสงสัย ชื่อพารามิเตอร์แบบเต็มมีความเข้ากันได้ดีที่สุด -rอาจจะไม่ชัดเจนในวันนี้ แต่ไม่มีอะไรหยุดรุ่นอนาคตของคำสั่งจากการแนะนำพารามิเตอร์ใหม่ คุณกำลังจะใช้ IDE (ทั้ง ISE หรือ VS Code) กดCtrl+ Spaceและเติมพารามิเตอร์อัตโนมัติให้สมบูรณ์

ทราบว่าls -r เป็นที่คลุมเครือ เป็นพารามิเตอร์ของผู้อื่น-ReadOnlyGet-ChildItem

เมื่อระบุอาร์กิวเมนต์สตริงสำหรับ cmdlets คุณใส่คำพูดไว้ในเครื่องหมายคำพูด (New-Object 'System.Int32' กับ New-Object System.Int32

โดยทั่วไปควรใช้อัญประกาศเฉพาะเมื่อจำเป็นเท่านั้น (เช่นNew-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'ใช้คำพูดเดี่ยวเมื่อคุณสามารถทำได้และใช้เครื่องหมายคำพูดคู่เฉพาะเมื่อคุณจำเป็นต้องใส่ในเครื่องหมายคำพูดเดี่ยวหรือต้องการฝังตัวแปร

เมื่อคุณเขียนฟังก์ชั่นและตัวกรองคุณระบุประเภทของพารามิเตอร์หรือไม่

ฉันมักจะทำเว้นแต่ฉันจะต้องยอมรับประเภทที่หลากหลายด้วยพารามิเตอร์เดียวกันโดยเฉพาะและไม่ต้องการเขียนชุดพารามิเตอร์แต่ละชุด

คุณเขียน cmdlets ในกรณีที่ถูกต้อง (เป็นทางการ) หรือไม่?

กรณีปาสกาล ใช่.

สำหรับคำหลักเช่น BEGIN ... กระบวนการ ... END คุณเขียนด้วยตัวพิมพ์ใหญ่เท่านั้นหรือไม่

ผมเคยเห็นงบประกอบการและโครงสร้างภาษาBegin, If, ForEach, -NotInเช่นเดียวกับbegin, if, ,foreach -notinโดยส่วนตัวแล้วฉันชอบตัวพิมพ์เล็กและใช้คำสั่งเป็นตัวพิมพ์เล็ก แต่ก็เหมือนกันทั้งคู่

อื่น ๆ :

  • ระบุพารามิเตอร์เสมอ อย่าพึ่งพาคำสั่งตำแหน่ง มากกว่าNew-Object -TypeName System.Int32 New-Object System.Int32ฉันไม่ทราบว่ามีการตกลงกันหรือไม่ แต่ดูเหมือนว่าจะสนับสนุนแนวคิดทั่วไปของ

  • Get-Verbถ้าผมเขียนโมดูลผมใช้คำกริยามาตรฐานที่ระบุไว้โดย รายการนี้แคบมาก ๆ ดังนั้นชื่อสคริปต์แบบสแตนด์อโลนสำหรับสคริปต์ที่มีเพียงฉันเท่านั้นที่จะทำงานไม่ได้ Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1ปัญหาเกี่ยวกับรายการกริยาทั่วไปก็คือว่ามันมีแนวโน้มที่ต่อเข้า ถ้าผมเขียนสคริปต์ที่สารสกัดจากหน้าเว็บบางหน้าจากไฟล์ PDF Get-ExtractedAccountPDFPages.ps1ที่ฉันไม่ได้เรียกมันว่า Extract-AccountPDFPages.ps1ผมเรียกมันว่า ฉันไม่กังวลเกี่ยวกับการค้นพบสคริปต์ที่ทำงานเป็นโปรแกรมและไม่ได้ตั้งใจให้เป็นแบบแยกส่วนเพราะเป็นเรื่องปกติ

  • ทำลายกฎเมื่ออ่านง่ายกว่าเป็นรูปธรรมมากขึ้นหรือบำรุงรักษาได้มากขึ้น


-3

ในช่วงหลายปีที่ผ่านมามีวิธีการเขียนชื่อหลายคำสำหรับตัวแปรฟังก์ชั่น ฯลฯ

PROGRAMFORSORTINGLOTSOFTHINGS นั้นอ่านยาก

PROGRAM_FOR_SORTING_LOTS_OF_THINGS ง่ายขึ้นเล็กน้อย

program_for_sorting_lots_of_things นั้นง่ายกว่า

ProgramForSortingLotsOf สิ่งที่ทำไปด้วยขีดเส้นใต้และรักษาความสามารถในการอ่าน Powershell ทำเช่นนี้เพื่อส่วนใหญ่


Powershell มักจะมีการผสมผสานของท่ออูฐ (ซึ่ง syntactically ไม่ได้หมายความว่าอะไร) และขีดคั่น ตัวอย่างเช่นGet-ChildItemมีเส้นประระหว่างคำกริยาและคำนาม
แอนดรูพูดว่า Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.