잘 알려진 PowerShell 코딩 규칙이 있습니까?


18

PowerShell에서 프로그래밍 할 때 잘 정의 된 규칙이 있습니까?

예를 들어, 장기적으로 유지 관리해야하는 스크립트에서 다음을 수행해야합니다.

  • 실제 cmdlet 이름 또는 별칭을 사용 하시겠습니까?
  • cmdlet 매개 변수 이름을 전체 또는 일부만 지정 ( dir -Recursevs dir -r)
  • cmdlet에 문자열 인수를 지정할 때는 따옴표로 묶어야합니다 ( New-Object 'System.Int32'New-Object System.Int32
  • 함수 및 필터를 작성할 때 매개 변수 유형을 지정합니까?
  • (공식) 올바른 경우에 cmdlet을 작성합니까?
  • 같은 키워드 BEGIN...PROCESS...END는 대문자로만 쓰십니까?

MSDN에는 PowerShell에 대한 코딩 규칙 문서가 부족한 것으로 보이지만 C #에 대한 문서는 존재합니다.




2
그러한 협약을 문서화하려는 커뮤니티 프로젝트가 있습니다. github.com/PoshCode/PowerShellPracticeAndStyle . 물론 차이는 있지만 스타일은 매우 개인적인 것입니다.
Chris Dent

답변:


8

@Robert Harvey는 좋은 공식 링크를 참조했습니다. 덜 공식적인 문서를 통해 내 생각은 다음과 같습니다.

실제 cmdlet 이름 또는 별칭을 사용 하시겠습니까?

별명이 전체 이름보다 명확한 경우에만 사용하십시오. 예를 들어, 대부분의 사람들은 이전 경험 보다 스크립트에서 더 명확 하게 찾 dir거나 ls더 명확 하다고 생각 Get-ChildItem합니다 (예 : 기본적으로 PowerShell 스크립트를 작성하는 사람은 모두 DOS 배치 스크립트 또는 Unix 스크립팅에서 두 번 중 하나를 가짐).

cmdlet 매개 변수 이름을 전체 또는 부분적으로 만 지정하십시오 (dir -Recurse와 dir -r)

스크립트에서는 위의 예와 달리 짧은 스위치가 실제로 철자를 쓰는 것보다 분명한 시간을 생각할 수 없기 때문에 이름을 완전히 철자 합니다. 스위치 이름이 짧을수록 입력 내용이 저장됩니다. 커맨드 라인에서 이것은 필수적입니다. 스크립트에서 추가 키 스트로크는 가독성과 유지 관리 성을 위해 가치가 있습니다.

cmdlet에 문자열 인수를 지정할 때는 따옴표로 묶어야합니다 (New-Object 'System.Int32'대 New-Object System.Int32).

코드를 읽을 때 문자열 인수를 따옴표로 묶는 것이 훨씬 더 분명해 보이기 때문에 포함시킬 것입니다.

함수 및 필터를 작성할 때 매개 변수 유형을 지정합니까?

통역사에 대한 모호성을 해결하기 위해 그렇게해야 할 경우에만 (발생하는). 모든 것에 유형을 입력하려고 시도하는 경우 C # 명령 줄 응용 프로그램을 작성하여 작성할 수도 있습니다 (항상 나쁜 것은 아니지만 스크립팅으로 얻는 시간 절약은 무효입니다).

(공식) 올바른 경우에 cmdlet을 작성합니까?

당신 은해야합니다 . 나는 보통 한다. 서둘 렀을 때 나는 문법적으로 중요하지 않기 때문에 사건에 대해 약간 느긋한 것으로 알려져 있습니다.

BEGIN ... PROCESS ... END와 같은 키워드는 대문자로만 작성합니까?

아니요. FORTRAN이 아닙니다. 나는 대부분의 사람들 이보다 더 읽 begin거나 Begin읽을 수 있다고 생각 BEGIN합니다. 모든 상한값을 온라인으로 외치는 소리와 연관시키고 프로그램의 가장 평범한 부분을 외치는 이유는 가장 중요하지 않은 부분에주의를 기울임으로써 가독성을 방해합니다.

지도 교장은 가독성이어야합니다. 빠르고 더러운 프로그램이라는 본질 상 스크립트는 쓰기 전용 코드를 지향합니다. 귀하와 귀하의 팀이 6 개월 안에 스크립트를 계속 이해할 수 있도록 모든 결정을 내려야합니다. 코드를 볼 때 자신의 신발을 벗고 다음과 같은 질문을 해보십시오. "일주일 전에이 일을 시작했다면 (그리고 실제로 일반 문화에 익숙하지 않은 경우) 이것이 어떻게 쓰여지는지 알게 될 것입니다. 또는 혼란 스러운가? "


2

Microsoft는 매우 우수한 Cmdlet 개발 지침 을 작성하고 게시했습니다.

발췌 :

이 섹션의 항목에서는 올바른 형식의 cmdlet을 생성하는 데 사용할 수있는 개발 지침을 제공합니다. Windows PowerShell 런타임에서 제공하는 공통 기능을 활용하고 이러한 지침을 따르면 최소한의 노력으로 강력한 cmdlet을 개발하고 사용자에게 일관된 환경을 제공 할 수 있습니다. 또한 일반적인 기능은 다시 테스트하지 않아도되므로 테스트 부담이 줄어 듭니다.

이 섹션의

이 지침은 모든 언어로 제한되지 않으며 (언어는 언급하지 않음) PowerShell에서 Cmdlet을 작성할 때 완벽하게 적용됩니다.

이 지침을 사용하면 명확하고 검색 가능하며 사용 가능하고 재사용 가능한 Cmdlet을 작성하는 데 도움이됩니다. 이 지침에 따라 여러 PowerShell 모듈을 만든 후에는 어렵지 않으며 더 나은 PowerShell 개발자가 될 수있었습니다. 이 기술은 간단한 스크립트를 작성할 때도 직접 사용할 수 있습니다.


1
이들은 PowerShell을 작성하는 방법이 아니라 cmdlet을 작성하는 방법에 대한 것 같습니다.
Philip Kendall

@PhilipKendall 그들은 정말로합니다. 이것은 완전한 질문에 대답하지 못할 수도 있지만 이것이 질문에 가치를 더한다고 생각합니다. 순수한 PowerShell에서 Cmdlet을 완벽하게 작성할 수 있으며 이러한 지침이 실제로 도움이됩니다. PowerShell에서 좋은 Cmdlet을 작성할 수 있다면 좋은 PowerShell 스크립트도 작성할 수 있습니다.
oɔɯǝɹ

1

두 번째 답변으로; PSScriptAnalyzer 모듈을 사용 하여 코드를 확인할 수 있습니다.

Invoke-ScriptAnalyzer -Path .

규칙 세트를 사용한 코드 분석을 기반으로합니다. 코드 디자인의 유효성을 검사하고 코드에서 많은 작은 문제를 감지하는 데 도움이됩니다.

설계 및 품질 문제를 파악하기 위해 빌드 (빌드 및 모듈에 개인 저장소를 사용)에 통합했습니다.

관심이 있으신 경우이 모듈에는 여러 스타일을 사용할 수있는 PowerShell 코드 포맷터도 포함되어 있으므로이를 사용하여 코드 레이아웃을 표준화 할 수 있습니다.


0

@ oɔɯǝɹ의 답변에있는 문서는 다소 접선 원 인 경우 좋습니다.

당신은 노화 PowerShell을 ISE를 교체 한 후 설치 예정입니다 비주얼 스튜디오 코드, 사용하는 경우 VS 코드 PowerShell을 확장 했다 여러 서식 옵션을 포함, 적어도 부분적 에 기초 비공식 PowerShell을 모범 사례 및 스타일 가이드를 . VS Code와 PowerShell 확장은 모두 Microsoft에서 관리하므로 비공식 가이드만큼 공식적입니다.

나는 그들이 진술 한 모든 것에 동의하지 않습니다. 예를 들어 필자는 필요하지 않은 세미콜론이 필요한 PHP, Java, C # 및 SQL에서 왔습니다. 코드가 없으면 나에게 잘못 보이 므로 포함시킵니다. 이 경우 #requires SemicolonTerminator대부분의 스크립트에서 활성화하면 공백이 줄 바꿈에 대해 걱정할 필요가 없습니다. 나는 캐리지 리턴과 다른 VB-ism을 탈출하는 것을 싫어합니다.

이것들의 나머지는 나의 의견이다 :

실제 cmdlet 이름 또는 별칭을 사용 하시겠습니까?

모호하지 마십시오. 저장된 스크립트에서 별명을 사용하지 마십시오. 기본 별명까지도 사용자가 기본 별칭을 변경하는 것을 막을 수있는 것은 없습니다. 변경 불가능하다고 가정하는 것이 더 안전합니다.

cmdlet 매개 변수 이름을 전체 또는 부분적으로 만 지정하십시오 (dir -Recurse와 dir -r)

다시 한 번 모호하지 마십시오. 전체 매개 변수 이름은 최상의 순방향 호환성을 갖습니다. -r오늘 모호하지는 않지만 향후 버전의 명령이 새로운 매개 변수를 도입하는 것을 막을 수는 없습니다. IDE (ISE 또는 VS Code)를 사용하게됩니다. 히트 Ctrl+ Space그 매개 변수를 자동으로 완성.

그 주 ls -r 입니다 모호합니다. -ReadOnly또 다른 매개 변수입니다 Get-ChildItem.

cmdlet에 문자열 인수를 지정할 때는 따옴표로 묶어야합니다 (New-Object 'System.Int32'대 New-Object System.Int32).

일반적으로 따옴표는 필요할 때만 사용해야합니다 (예 : New-Object -TypeName 'System.Collections.Generic.HashSet[System.Int32]'. 가능하면 작은 따옴표를 사용하고 작은 따옴표를 캡슐화하거나 변수를 포함해야하는 경우 큰 따옴표 만 사용하십시오).

함수 및 필터를 작성할 때 매개 변수 유형을 지정합니까?

동일한 매개 변수로 다양한 유형을 구체적으로 수용해야하고 개별 매개 변수 세트를 작성하지 않으려는 경우가 아니라면 일반적으로 수행합니다.

(공식) 올바른 경우에 cmdlet을 작성합니까?

파스칼 케이스. 예.

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입니다. PDF 파일에서 특정 페이지를 추출하는 스크립트를 작성하는 경우 호출하지 않습니다 Get-ExtractedAccountPDFPages.ps1. 나는 그것을 부르고있다 Extract-AccountPDFPages.ps1. 나는 프로그램 자체로 실행되는 스크립트의 발견 가능성에 대해 걱정하지 않으며 본질적으로 모듈식이 아닙니다.

  • 더 읽기 쉽고, 구체적이거나 유지 관리가 쉬운 규칙을 어기십시오.


-3

수년에 걸쳐 변수, 함수 등에 대한 다중 단어 이름을 작성하는 다양한 방법이있었습니다.

PROGRAMFORSORTINGLOTSOFTHINGS는 읽기 어렵습니다.

PROGRAM_FOR_SORTING_LOTS_OF_THINGS가 조금 더 쉽습니다.

program_for_sorting_lots_of_things는 아직 더 쉽습니다.

ProgramForSortingLotsOfThings는 밑줄을 없애고 가독성을 유지합니다. Powershell은 대부분을 위해 이것을 수행합니다.


Powershell은 일반적으로 낙타 케이싱 (구문 적으로 의미가 없음)과 대시를 혼합하여 사용합니다. 예를 들어 Get-ChildItem동사와 명사 사이에 대시가 있습니다.
앤드류는 모니카 복원 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.