Có các quy ước mã hóa PowerShell nổi tiếng không?


18

Có bất kỳ quy ước nào được xác định rõ khi lập trình trong PowerShell không?

Ví dụ, trong các tập lệnh sẽ được duy trì lâu dài, chúng ta cần phải:

  • Sử dụng tên cmdlet thực hay bí danh?
  • Chỉ định tên tham số cmdlet đầy đủ hoặc chỉ một phần ( dir -Recurseso với dir -r)
  • Khi chỉ định đối số chuỗi cho lệnh ghép ngắn, bạn có đặt chúng trong dấu ngoặc kép ( New-Object 'System.Int32'so vớiNew-Object System.Int32
  • Khi viết các hàm và bộ lọc bạn có chỉ định các loại tham số không?
  • Bạn có viết lệnh ghép ngắn trong trường hợp đúng (chính thức) không?
  • Đối với các từ khóa như BEGIN...PROCESS...ENDbạn chỉ viết chúng bằng chữ hoa?

Có vẻ như MSDN thiếu tài liệu quy ước mã hóa cho PowerShell, trong khi tài liệu đó tồn tại ví dụ cho C #.




2
Có một dự án cộng đồng đang cố gắng ghi lại các quy ước như vậy. github.com/PoshCode/PowerShellPracticeAndStyle . Tất nhiên có sự khác biệt, phong cách là một thứ rất riêng.
Chris Dent

Câu trả lời:


8

@Robert Harvey tham khảo một số liên kết chính thức tốt. Bằng một tài liệu ít chính thức hơn, suy nghĩ của tôi sẽ là:

Sử dụng tên cmdlet thực hay bí danh?

Chỉ sử dụng bí danh nếu nó rõ ràng hơn tên đầy đủ. Ví dụ, tôi nghĩ rằng hầu hết mọi người sẽ tìm thấy dirhoặc lsrõ ràng hơn trong một tập lệnh hơn là Get-ChildItemdựa trên kinh nghiệm trước đó (ví dụ về cơ bản bất kỳ ai viết tập lệnh PowerShell đều có một trong hai lần đó trong các tập lệnh bó DOS hoặc tập lệnh Unix).

Chỉ định tên tham số cmdlet đầy đủ hoặc chỉ một phần (dir -Recurse so với dir -r)

Trong một kịch bản, tôi sẽ hoàn toàn giải thích rõ ràng tên vì (không giống như ví dụ trên) Tôi không thể nghĩ ra một thời gian nơi công tắc ngắn hơn sẽ thực sự được nhiều hơn rõ ràng so với đánh vần nó ra. Tên chuyển đổi ngắn hơn là để lưu gõ. Tại một dòng lệnh, điều này là bắt buộc. Trong một kịch bản, các tổ hợp phím bổ sung rất đáng giá cho khả năng đọc và bảo trì.

Khi chỉ định đối số chuỗi cho lệnh ghép ngắn, bạn có đặt chúng trong dấu ngoặc kép (New-Object 'System.Int32' so với New-Object System.Int32

Việc bao gồm các đối số chuỗi trong dấu ngoặc kép có vẻ rõ ràng hơn nhiều khi đọc qua mã, vì vậy tôi sẽ bao gồm chúng.

Khi viết các hàm và bộ lọc bạn có chỉ định các loại tham số không?

Chỉ khi có nhu cầu làm như vậy để giải quyết sự mơ hồ cho người phiên dịch (điều này xảy ra). Nếu bạn định thử và đặt các loại trên mọi thứ, bạn cũng có thể viết và viết các ứng dụng dòng lệnh C # (điều này không phải lúc nào cũng là điều xấu, nhưng nó phủ nhận việc tiết kiệm thời gian bạn có được bằng cách viết kịch bản).

Bạn có viết lệnh ghép ngắn trong trường hợp đúng (chính thức) không?

Bạn nên . Tôi thường làm. Khi vội vàng, tôi đã được biết là một chút lỏng lẻo trong trường hợp vì nó không quan trọng về mặt cú pháp.

Đối với các từ khóa như BEGIN ... QUY TRÌNH ... HẾT bạn chỉ viết chúng bằng chữ hoa?

Không. Đây không phải là FORTRAN. Tôi nghĩ rằng hầu hết mọi người tìm thấy beginhoặc Begindễ đọc hơn BEGIN. Có một lý do chúng tôi liên kết tất cả các mũ với la hét trực tuyến và hét những phần trần tục nhất của chương trình cản trở khả năng đọc bằng cách thu hút sự chú ý của một người vào những phần quan trọng nhất.

Hiệu trưởng hướng dẫn phải dễ đọc. Các tập lệnh, về bản chất là các chương trình nhanh và bẩn, xoay quanh mã chỉ viết. Mọi quyết định của bạn nên được đưa ra để đảm bảo rằng bạn và nhóm của bạn vẫn có thể hiểu được kịch bản trong sáu tháng. Hãy thử tự đi ra khỏi đôi giày của bạn khi nhìn vào mã của bạn và đặt câu hỏi này: "nếu tôi đã bắt đầu công việc này một tuần trước (và vì vậy không thực sự được truyền vào văn hóa chung) tôi sẽ tìm thấy cách viết này được chiếu sáng hay khó hiểu? "


2

Microsoft đã viết và xuất bản một bộ Nguyên tắc phát triển Cmdlet rất tốt

Trích đoạn:

Các chủ đề trong phần này cung cấp các hướng dẫn phát triển mà bạn có thể sử dụng để tạo ra các lệnh ghép ngắn được hình thành tốt. Bằng cách tận dụng chức năng phổ biến được cung cấp bởi thời gian chạy Windows PowerShell và bằng cách làm theo các hướng dẫn này, bạn có thể phát triển các lệnh ghép ngắn mạnh mẽ với nỗ lực tối thiểu và cung cấp cho người dùng trải nghiệm nhất quán. Ngoài ra, bạn sẽ giảm gánh nặng kiểm tra vì chức năng phổ biến không yêu cầu kiểm tra lại.

Trong phần này

Các nguyên tắc này không giới hạn ở bất kỳ ngôn ngữ nào (chúng không đề cập đến một ngôn ngữ) và hoàn toàn có thể áp dụng khi viết Cmdlets trong PowerShell.

Sử dụng các hướng dẫn này sẽ giúp bạn viết Cmdlets rõ ràng, có thể khám phá, có thể sử dụng và sử dụng lại. Tôi thấy sau khi tạo một số mô-đun PowerShell theo các hướng dẫn này không khó và đã giúp tôi trở thành nhà phát triển PowerShell tốt hơn. Kỹ năng đó có thể sử dụng trực tiếp khi viết các kịch bản đơn giản.


1
Chúng có vẻ nhiều hơn về cách viết lệnh ghép ngắn, thay vì cách viết PowerShell.
Philip Kendall

@PhilipKendall họ thực sự làm. Điều này có thể không trả lời câu hỏi hoàn chỉnh, nhưng tôi tin rằng điều này làm tăng giá trị cho câu hỏi. Lưu ý rằng bạn có thể viết Cmdlets của mình một cách hoàn hảo trong PowerShell thuần túy và các nguyên tắc này cũng thực sự có ích với điều đó. Nếu bạn có thể viết một Cmdlet tốt trong PowerShell, thì bạn cũng có thể viết các kịch bản PowerShell tốt.
oɔɯǝɹ

1

Như một câu trả lời thứ hai; bạn có thể sử dụng mô-đun PSScriptAnalyzer để xác thực mã của mình.

Invoke-ScriptAnalyzer -Path .

Nó dựa trên phân tích mã, sử dụng bộ quy tắc. Nó sẽ xác nhận thiết kế mã và sẽ giúp bạn phát hiện nhiều vấn đề nhỏ trong mã của mình.

Chúng tôi kết hợp nó trong các bản dựng của chúng tôi (chúng tôi sử dụng các bản dựng và kho lưu trữ riêng cho các mô-đun), để nắm bắt các vấn đề về thiết kế và chất lượng.

Nếu bạn quan tâm, mô-đun này cũng chứa một bộ định dạng mã PowerShell (có thể sử dụng nhiều kiểu), vì vậy bạn cũng có thể sử dụng nó để chuẩn hóa bố cục mã.


0

Các tài liệu trong câu trả lời của @ oɔɯǝɹ là một nguồn tốt, nếu hơi tiếp tuyến.

Nếu bạn sử dụng Visual Studio Code, được lên kế hoạch để thay thế PowerShell ISE đã cũ, sau đó cài đặt tiện ích mở rộng VS Code PowerShell , bao gồm một số tùy chọn định dạng ít nhất một phần dựa trên Hướng dẫn về phong cách và thực tiễn tốt nhất của PowerShell . Cả VS Code và tiện ích mở rộng PowerShell đều do Microsoft quản lý, do đó, đây là hướng dẫn chính thức như một hướng dẫn không chính thức.

Tôi không đồng ý với mọi thứ họ nêu. Ví dụ: tôi đến từ PHP, Java, C # và SQL nơi có dấu chấm phẩy nếu không cần thiết. Mã có vẻ sai đối với tôi mà không có họ, vì vậy tôi bao gồm chúng. Nếu có một cái #requires SemicolonTerminatortôi sẽ kích hoạt nó trên hầu hết các tập lệnh của mình thì tôi không phải lo lắng về việc khoảng trắng sẽ phá vỡ một dòng. Tôi ghét việc quay trở lại xe ngựa và các đồng vị VB khác.

Phần còn lại là ý kiến ​​của tôi:

Sử dụng tên cmdlet thực hay bí danh?

Hãy rõ ràng. Không bao giờ sử dụng bí danh trong tập lệnh đã lưu; thậm chí là một bí danh mặc định. Không có gì ngăn người dùng thay đổi bí danh mặc định. Sẽ an toàn hơn khi cho rằng chúng không bất biến.

Chỉ định tên tham số cmdlet đầy đủ hoặc chỉ một phần (dir -Recurse so với dir -r)

Một lần nữa, hãy rõ ràng. Tên tham số đầy đủ có khả năng tương thích tốt nhất. -rcó thể không rõ ràng ngày hôm nay, nhưng không có gì ngăn cản các phiên bản tương lai của lệnh giới thiệu các tham số mới. Bạn sẽ sử dụng IDE (Mã ISE hoặc VS). Nhấn Ctrl+ Spacevà tự động hoàn thành tham số đó.

Lưu ý đó ls -r mơ hồ. -ReadOnlylà một tham số khác của Get-ChildItem.

Khi chỉ định đối số chuỗi cho lệnh ghép ngắn, bạn có đặt chúng trong dấu ngoặc kép (New-Object 'System.Int32' so với New-Object System.Int32

Nói chung, chỉ nên sử dụng dấu ngoặc kép khi cần thiết (ví dụ: New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'Sử dụng dấu ngoặc đơn khi bạn có thể và chỉ trích dẫn khi bạn cần đóng gói dấu ngoặc đơn hoặc cần nhúng biến.

Khi viết các hàm và bộ lọc bạn có chỉ định các loại tham số không?

Tôi thường làm, trừ khi tôi đặc biệt cần chấp nhận nhiều loại với cùng một tham số và không muốn viết các bộ tham số riêng lẻ.

Bạn có viết lệnh ghép ngắn trong trường hợp đúng (chính thức) không?

Trường hợp Pascal. Đúng.

Đối với các từ khóa như BEGIN ... QUY TRÌNH ... HẾT bạn chỉ viết chúng bằng chữ hoa?

Tôi đã nhìn thấy báo cáo, các nhà khai thác, và các cấu trúc ngôn ngữ như Begin, If, ForEach, -NotIncũng như begin, if, foreach, -notin. Cá nhân, tôi thích chữ thường và để lại các lệnh như trường hợp Pascal, nhưng cả hai đều phổ biến như nhau.

Khác:

  • Luôn chỉ định tham số. Đừng dựa vào thứ tự vị trí. New-Object -TypeName System.Int32trên New-Object System.Int32. Tôi không biết nếu điều đó được thỏa thuận, nhưng, một lần nữa, nó dường như ủng hộ ý tưởng chung về "không mơ hồ".

  • Nếu tôi đang viết một mô-đun, tôi sử dụng các động từ tiêu chuẩn được chỉ định bởi Get-Verb. Tuy nhiên, danh sách này cực kỳ hẹp, vì vậy tên tập lệnh độc lập cho các tập lệnh mà chỉ bản thân tôi sẽ chạy thường không có. Vấn đề với danh sách động từ chung là nó có xu hướng hướng vào Get-ScriptForSpecificPurposeNoNotThatOneTheOtherOne.ps1. Nếu tôi đang viết một tập lệnh trích xuất một số trang nhất định từ tệp PDF, tôi sẽ không gọi nó Get-ExtractedAccountPDFPages.ps1. Tôi đang gọi nó Extract-AccountPDFPages.ps1. Tôi không quan tâm đến khả năng khám phá của một tập lệnh chạy như một chương trình và không có ý định được mô đun hóa bởi chính bản chất của nó.

  • Phá vỡ các quy tắc khi nó dễ đọc hơn, cụ thể hơn hoặc dễ bảo trì hơn.


-3

Trong những năm qua, đã có nhiều cách để viết tên nhiều từ cho các biến, hàm, v.v.

PROGRAMFORSORTINGLOTSOFTHING rất khó đọc.

PROGRAM_FOR_SORTING_LOTS_OF_THINGS dễ dàng hơn một chút.

chương trình_for_sorting_lots_of_things dễ dàng hơn.

Chương trìnhForSortingLotsOfThings không có dấu gạch dưới và duy trì khả năng đọc. Powershell làm điều này cho hầu hết các phần.


Powershell thường kết hợp vỏ lạc đà (về mặt cú pháp không có nghĩa gì cả) và dấu gạch ngang. Ví dụ, Get-ChildItemvới một dấu gạch giữa động từ và danh từ.
Andrew nói Phục hồi lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.