를 사용하여 PSScriptAnalyzer 을 확인 PowerShell 버전 호환성
PSScriptAnalyzer 버전 1.18 최근에 출시되었고,배 강력한 새로운 규칙을 확인할 수 있습니다 PowerShell 에 대한 스크립트의 호환성을 가진 다른 PowerShell 전 및 환경입니다.
이 블로그 포스트에서 첫 번째 시리즈에서,우리가 사용하는 방법을 참조하십시오한 이러한 새로운 규칙을 확인에 대한 스크립트를 실행하는 데 문제에 PowerShell3,5.1 6.
잠깐,PSScriptAnalyzer 는 무엇입니까?,
PSScriptAnalzyer 는 PowerShell 에 대한 정적 분석(또는 linting)및 일부 동적 분석(환경 상태에 따라)을 제공하는 모듈입니다. 그것을 찾을 수 있는 문제 해결에 있는 나쁜 습관 PowerShell 스크립트를 만들고,그들과 유사한 방법으로 C#컴파일러를 줄 것이다 당신은 경고와 오류를 발견 C#의 코드기 전에 실행됩니다.,
사용하는 경우 VSCode PowerShell 확장,당신이 볼 수은”녹색 물결 모양 밑줄”및 문제 보고서는 PSScriptAnalyzer 에 대해 생성하는 스크립트를 작성자:
설치할 수 있습니다 PSScriptAnalyzer 를 사용에 당신의 자신의 스크립트:
Install-Module PSScriptAnalyzer -Scope CurrentUser
PSScriptAnalyzer 작품의 시리즈를 실행하여 규칙에서 스크립트,각각 독립적으로 평가 어떤 문제입니다., 예를 들어AvoidUsingCmdletAliases
검사는 별칭이 사용되지 않습에서 스크립트,그리고MisleadingBackticks
는지 확인합 backticks 라인의 끝에 없는 다음에 공백.
자세한 내용은 PSScriptAnalyzer 딥 다이브 블로그 시리즈를 참조하십시오.
을 소개합성을 확인 규칙
새로운 호환성을 확인하는 기능을 제공하는 세 가지 새로운 규칙:
- PSUseCompatibleSyntax 여부를 확인하는 구문에서 사용되는 스크립트에서 작동합니다 다른 PowerShell 버전입니다.,
- 스크립트에 사용 된 명령이 다른 PowerShell 환경에서 사용 가능한지 여부를 확인하는 PSUseCompatibleCommands.
- PSUseCompatibleTypes,.NET 유형 및 정적 메서드/속성을 다른 PowerShell 환경에서 사용할 수 있는지 여부를 확인합니다.
구문을 확인하는 규칙은 단순히 필요 목록의 PowerShell 버전 당신이 원하는 대상은 당신을 말할 것이는 구문에서 사용되는 스크립트에서 작동하지 않습니다 어떤 사람들의 버전입니다.,
명령 유형을 확인하는 규칙은 더 정교하고에 의존 프로파일(카탈로그의 명령 유형을 사용할 수)에서 일반적으로 사용되는 PowerShell 플랫폼입니다. 이러한 프로파일을 사용하려면 구성이 필요하며 아래에서 살펴 보겠습니다.
이 게시물에 대한을 살펴보고 구성 및 사용 PSUseCompatibleSyntax 및 PSUseCompatibleCommands 을 확인하는 스크립트와 함께 작동 다른 버전의 PowerShell. Psusecompatiblecommands 와 매우 유사하게 구성되어 있지만 나중에 게시물에서 PSUseCompatibleTypes 를 살펴 보겠습니다.,
작동 예:소 PowerShell 스크립트
상상 우리는 작은(고안된)아카이브 스크립트를 저장을.\archiveScript.ps1
이 스크립트로 작성되었 PowerShell6.2,그리고 우리는 테스트는 그것을 작동합니다. 그러나 우리는 또한 PowerShell5.1 을 실행하고 일부는 PowerShell3.0 을 실행하는 다른 머신에서도 실행하려고합니다.
이상적으로 우리는 그것을 테스트합니다 사람들에 다른 플랫폼을,그러나 그것은 좋은 것으면 우리는 시도할 수 있었을 가능한 한 많은 버그입니다.,
PSUseCompatibleSyntax 로 구문 검사
적용 할 첫 번째이자 가장 쉬운 규칙은 PSUseCompatibleSyntax 입니다. 우리가 만들려고 일부에 대한 설정을 PSScriptAnalyzer 규칙을 사용하려면 다음을 실행에 대한 분석이 우리 스크립트하려면 진단에 대한 호환성.PSScriptAnalyzer 를 실행하는 것은 간단합니다., 그것은 오로 PowerShell 모듈,그래서 그것의 일단에 설치되어 있는 모듈 경로에 당신을 호출에 그것을 당신의 파일에Invoke-ScriptAnalyzer
은 다음과 같습니다.
Invoke-ScriptAnalyzer -Path ".\archiveScript.ps1`
아주 간단한 호출을 다음과 같이 실행됩니다 PSScriptAnalyzer 를 사용하여 기본 규칙 및 구성 스크립트에 당신은 그것을 지적니다.
그러나 더 많은 타겟 구성이 필요하기 때문에 호환성 규칙은 기본적으로 활성화되어 있지 않습니다. 대신 구문 검사 규칙을 실행하기 위해 몇 가지 설정을 제공해야합니다., 특히 PSUseCompatibleSyntax 에는 스크립트로 타겟팅하는 PowerShell 버전 목록이 필요합니다.
실행하는 것이 우리에게 제시되는 출력은 다음과 같습니다.
이것은 우리에게 말하는]::new()
구문을 사용했습에서 작동하지 않습니다 PowerShell3. 보다 더 즉,이 경우에는 규칙이 실제로 제정:
$diagnostics = Invoke-ScriptAnalyzer -Path .\archiveScript.ps1 -Settings $settings$diagnostics.SuggestedCorrections
제안된 개정은 사용하는New-Object
대신 합니다., 이 방법을 제안할 수 있는 것은 약간의 인정과 함께 여기에 모든 위치 정보를,그러나 우리는 볼 수 있습니 나중에 왜 이런 유용합니다.
이 사전 예 약간의 인공 물론(이 해시 테이블이 올 것이 더 자연스럽게),하지만 스패너에 던져 작품에서 PowerShell3 개 또는 4 개의::new()
는 흔하지 않습니다. 또한 PSUseCompatibleSyntax 규칙은 제작중인 PowerShell 의 버전에 따라 클래스,워크 플로 및using
문에 대해 경고합니다.,먼저 보여줄 것이 더 많기 때문에 제안 된 변경 사항을 아직 만들지 않을 것입니다.
PSUseCompatibleCommands 로 명령 사용 확인
이제 명령을 확인하려고합니다. 기 때문에 명령을 호환성보다 조금 더 복잡한 구문(가용성 이후의 명령에 따라 달라지는 것보다 더 많은 버전의 PowerShell 이 실행되고),우리 대상 프로파일 대신 합니다.
프로파일은 일반적인 PowerShell 환경을 실행하는 스톡 머신에서 가져온 정보의 카탈로그입니다., 사람에 출 PSScriptAnalyzer 할 수 없는 항상 당신의 작업 환경을 완벽하게,하지만 그들은 아주 가까이 와서(도있는 방법을 자신의 생성 프로필,상에서 블로그 포스팅). 우리의 경우 Windows 에서 PowerShell3.0,PowerShell5.1 및 PowerShell6.2 를 타겟팅하려고합니다. 우리는 처음 두 개의 프로파일을 가지고 있지만,마지막 경우에는 대신 6.1 을 타겟팅해야합니다. 이러한 목표는 매우 가깝기 때문에 경고는 여전히 PowerShell6.2 사용과 관련이 있습니다. 나중에 6.2 프로파일을 사용할 수있게되면,우리는 그 이상으로 전환 할 수있을 것입니다.,
우리는 기본적으로 사용할 수있는 프로파일의 목록에 대한 PSUseCompatibleCommands 설명서 아래에 볼 필요가있다. 우리가 원하는 대상을 우리가 선택:
긴 이름을 오른쪽에는 표준 프로파일한 식별자는 우리가 사용하는 설정에서
지연이 발생할 수 있습 첫 번째 시간에 당신은 실행이기 때문에 규칙을 로드하는 데 필요한 카탈로그 캐시입니다. PowerShell 플랫폼의 각 카탈로그에는 모든 모듈의 세부 정보가 포함되어 있습니다.,해당 플랫폼에서 PowerShell 에 사용할 수있는 NET 어셈블리는 15,000 개의 매개 변수가있는 1700 개의 명령과 10,000 개의 유형이있는 100 개의 어셈블리가 될 수 있습니다. 그러나 일단로드되면 추가 호환성 분석이 빠를 것입니다. 우리는 출력 이
RuleName Severity ScriptName Line Message-------- -------- ---------- ---- -------PSUseCompatibleCommands Warning archiveScr 2 The parameter "FullyQualifiedName" is not available for ipt.ps1 command "Import-Module" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 12 The command "Get-FileHash" is not available by default in ipt.ps1 PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 18 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "5.1.17763.316" on platform "Microsoft Windows Server 2019 Datacenter"PSUseCompatibleCommands Warning archiveScr 18 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 19 The command "Compress-Archive" is not available by ipt.ps1 default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 23 The parameter "NoNewline" is not available for command ipt.ps1 "Out-File" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"
이라고 말씀하셨:
-
Import-Module
지원하지 않는-FullyQualifiedName
PowerShell3.0; -
Get-FileHash
에 존재하지 않 PowerShell3.0; -
Split-Path
없-LeafBase
PowerShell5.1PowerShell3.,0; -
Compress-Archive
에서 사용할 수 없습니다 PowerShell3.0; -
Out-File
지원하지 않는-NoNewline
PowerShell3.0
한 눈에 띄는 것은 바로는Get-FoldersToArchive
기능하지 않은 것에 대해 경고했다. 이 때문에 이 호환성 규칙을 설계를 무시하는 사용자가 제공하는 명령 명령어만으로 표시되는 경우에 존재하는 어떤 프로필에 있지 않고 하나의 목표입니다.,
다시,변경할 수 있습니다 우리는 스크립트를 수정한 경고,그러나 우리가 전에,나는 당신을 보여주고 싶게 만드는 방법이 더 많은 지속적인 경로를 변경하는 스크립트,알고 싶은 경우에는 변경사항은 호환성,그리고 쉽게 할 사항은 아래와 같습니다.
를 사용하여 설정 파일에 대한 호출이 반복
첫 번째 것은 우리가 원하는 PSScriptAnalyzer 호출을 자동화 가능합니다. 좋은 단계로서 이는 설정을 해시 테이블 우리가 만으로 전환을 선언하는 데이터 파일을 분리하면”무엇에서””방법”.,
PSScriptAnalyzer 을 받아들의 경로를 PSD1-Settings
매개변수,그래서 우리가 할 일은 우리의 hashtable 로 PSD1 파일에 우리는./PSScriptAnalyzerSettings.psd1
. 지 우리는 우리에 병합할 수 있습에 대한 설정을 모두 PSUseCompatibleSyntax 및 PSUseCompatibleCommands:
이제 우리는 실행할 수 있습니다 PSScriptAnalyzer 에 다시 설정을 사용하는 스크립트 파일:
Invoke-ScriptAnalyzer -Path ./archiveScript.ps1 -Settings ./PSScriptAnalyzerSettings.psd1
이면 다음과 같이 출력됩니다:
RuleName Severity ScriptName Line Message-------- -------- ---------- ---- -------PSUseCompatibleCommands Warning archiveScr 1 The parameter "FullyQualifiedName" is not available for ipt.ps1 command "Import-Module" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 9 The command "Get-FileHash" is not available by default in ipt.ps1 PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 12 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 12 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "5.1.17763.316" on platform "Microsoft Windows Server 2019 Datacenter"PSUseCompatibleCommands Warning archiveScr 13 The command "Compress-Archive" is not available by ipt.ps1 default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 16 The parameter "NoNewline" is not available for command ipt.ps1 "Out-File" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleSyntax Warning archiveScr 6 The constructor syntax ipt.ps1 "]::new()" is not available by default in PowerShell versions 3,4
이제 우리에게 의존하지 않고 어떤 변수가 더 이상 고 있는 별도의 spefication 의 분석을 원합니다., 를 사용하여 이를 배치할 수 있습니다 이것으로 지속적인 통합 환경에서 예를 들어 체크를 변경하는 스크립트에서 휴식 하지 않 호환성.
그러나 우리가 정말로 원하는 것은 PowerShell 스크립트를 편집 할 때 호환성을 유지한다는 것을 아는 것입니다. 그 어떤 설정 파일 구축하고,또한 그것의 가장 쉽게 변경을 만들기 위해 필요한 스크립트 호환됩니다. 이를 위해 VSCode PowerShell 확장 프로그램과 통합하려고합니다.,
통합 VSCode for on-the-fly 호환성 검사
로 설명에서 시작 이후,VSCode PowerShell 확장 내장 지원을 위한 PSScriptAnalyzer. 사실,로 버전 1.12.0,PowerShell 확장으로 선박 PSScriptAnalyzer1.18,당신을 의미하지 않는 아무것도 할 필요가 이외의 다른 설정 파일을 만들지의 호환성 분석입니다.
우리는 이미 우리의 설정 파일을 준비해 가는 마지막 단계에서,그래서 우리가 할 일은 점 PowerShell 확장자는 파일에서 VSCode 설정합니다.,
Ctrl+로 설정을 열 수 있습니다(macOS 에서 Ctrl 대신 Cmd 를 사용하십시오). 설정보기에서PowerShell > Script Analysis: Settings Path
를 원합니다. 이 작업을 수행하려면 다음 작업을 수행해야합니다., 입력하면 상대적인 경로를 설정 파일에서 우리의 작업 공간,그래서 우리는 그냥 넣어./PSScriptAnalyzerSettings.psd1
settings.json
view 이처럼 보입니다:
"powershell.scriptAnalysis.settingsPath": "./PSScriptAnalyzerSettings.psd1"
이제 열고,스크립트에서 VSCode 우리는”녹색 물결 모양 밑줄은”호환성을 위해 경고:
에서 문제가 창에서,당신은 전체 desrciption 의 모든 호환성:
자 수정하는 구문에 문제가 처음이다., 기억한다면 PSScriptAnalyzer 는이 문제에 대한 제안 된 수정 사항을 제공합니다. VSCode 통합 PSScriptAnalyzer 의 제안 수정 및 적용할 수 있는 그들을 클릭하면 당신은 전구 또는 Ctrl+공간을 할 때 지역에서 커:
이 변경을 적용하는 스크립트가 지금:
기타 호환성이 없 수정을 위해 지금 PSUseCompatibleCommands 알고있는 어떤 명령을 사용할 수 있습니다 각 플랫폼 하지만 무엇으로 대체할 때 명령을 사용할 수 없습니다., 그래서 우리는 그냥을 적용할 필요가 일부 PowerShell 지식:
우리는 이 같은 것(특정 구현은 중요하지 않지만,우리가 무언가에서 작동하는 모든 버전):
신할 수 있음을 확인할 수 있습니다 당신이 입력,VSCode 표시의 새로운 분석 당신이 무엇을 쓰고 녹색 물결 모양 밑줄을 드롭습니다. 할 때 우리는 우리 건강에 대한 스크립트의 호환성:
이 의미할 수 있습니다면 이 스크립트를 사용하여 모든 PowerShell 버전이 필요 대상입니다., 더 나은,당신은 지금은 구성에서 당신의 업무공간으로 당신이 쓰는 더 스크립트가,지속적인 확인을 위한 호환성. 그리고 만약 당신의 호환성을 목표물 변경,당신이해야 할 모든 당신이 변경 설정 파일을 한 곳에서 포인트를 원하는 대상에서 당신을 얻을 것이 분석에 대한 업데이트됩니다.
요약
희망이 이 블로그 게시물에서 당신의 몇 가지 아이디어로 새로운 호환성 규칙으로 오는 PSScriptAnalyzer1.18.,
우리는 커버를 설정하는 방법과 사용법을 확인 규칙,PSUseCompatibleSyntax,명령 규칙을 확인,PSUseCompatibleCommands,모두를 사용하여 해시 테이블의 구성과 설정 PSD1 파일입니다.
우리는 또한 보았을 사용하여 호환성 규칙에서 PowerShell 확장 VSCode,그들이 어디에서 기본적으로 버전 1.12.0.
VSCode 용 PowerShell 확장자(1.12.1)의 최신 릴리스가있는 경우 구성 파일을 설정하고 즉시 호환성 검사를받을 수 있습니다.,
다음에서 블로그 포스팅에서 살펴볼 것을 사용하는 방법 이러한 규칙을 PSUseCompatibleTypes(를 확인하는 경우.NET 유형과 정적 방법을 사용할 수 있는 대상에 플랫폼)데 도움이 될 수 있습니다 당신은 스크립트를 작성하는 작업 플랫폼에 걸쳐 윈도우와 리눅스를 사용하여 Windows PowerShell 및 PowerShell 핵심입니다.
롭 홀트
소프트웨어 엔지니어
PowerShell 팀