심각도 수준: 경고
기본 상태: 비활성화됨
묘사
이 규칙은 대상 PowerShell 플랫폼에서 사용할 수 없는 명령을 감지합니다.
PowerShell 플랫폼 이름은 다음과 같은 형식을 사용합니다:
<os-name>_<os-arch>_<os-version>_<ps-version>_<ps-arch>_<dotnet-version>_<dotnet-edition>
어디:
-
<os-name>: PowerShell이 실행 중인 운영 체제의 이름입니다. Windows에서는 SKU 번호가 포함되어 있습니다. 리눅스에서는 값이 배포판 이름입니다. -
<os-arch>: 운영체제가 실행되는 기계 아키텍처(보통x64). -
<os-version>: 운영체제의 자가 보고식 버전(리눅스 배포판 버전). -
<ps-version>: PowerShell 버전($PSVersionTable.PSVersion)입니다. -
<ps-arch>: PowerShell 프로세스의 컴퓨터 아키텍처입니다. -
<dotnet-version>: 보고된 버전의 .NET 런타임 PowerShell이System.Environment.Version실행 중입니다. -
<dotnet-edition>: .NET 런타임 버전 PowerShell이 실행 중입니다(현재framework또는core).
예를 들어:
-
win-4_x64_10.0.18312.0_5.1.18312.1000_x64_4.0.30319.42000_frameworkx64용 Windows 10 Enterprise(빌드 18312)에서 실행되는 PowerShell 5.1입니다. -
win-4_x64_10.0.18312.0_6.1.2_x64_4.0.30319.42000_core동일한 운영 체제에서 실행되는 PowerShell 6.1.2입니다. -
ubuntu_x64_18.04_6.2.0_x64_4.0.30319.42000_coreUbuntu 18.04에서 실행되는 PowerShell 6.2.0입니다.
PSScriptAnalyzer는 일부 플랫폼 프로필을 JSON 파일로 포함하고 있습니다. 이러한 내장 프로필을 설정에서 직접 타겟팅할 수 있습니다.
기본적으로 번들로 제공되는 플랫폼은 다음과 같습니다.
| PowerShell 버전 | 운영 체제 | 아이디 |
|---|---|---|
| 3.0 | Windows Server 2012 | win-8_x64_6.2.9200.0_3.0_x64_4.0.30319.42000_framework |
| 4.0 | 윈도우 서버 2012 R2 | win-8_x64_6.3.9600.0_4.0_x64_4.0.30319.42000_framework |
| 5.1 | 윈도우 서버 2016 | win-8_x64_10.0.14393.0_5.1.14393.2791_x64_4.0.30319.42000_framework |
| 5.1 | 윈도우 서버 2019 | win-8_x64_10.0.17763.0_5.1.17763.316_x64_4.0.30319.42000_framework |
| 5.1 | Windows 10 프로 | win-48_x64_10.0.17763.0_5.1.17763.316_x64_4.0.30319.42000_framework |
| 6.2 | Ubuntu 18.04 LTS | ubuntu_x64_18.04_6.2.4_x64_4.0.30319.42000_core |
| 6.2 | Windows 10.0.14393 | win-8_x64_10.0.14393.0_6.2.4_x64_4.0.30319.42000_core |
| 6.2 | Windows 10.0.17763 | win-8_x64_10.0.17763.0_6.2.4_x64_4.0.30319.42000_core |
| 6.2 | Windows 10.0.18362 | win-4_x64_10.0.18362.0_6.2.4_x64_4.0.30319.42000_core |
| 7.0 | Ubuntu 18.04 LTS | ubuntu_x64_18.04_7.0.0_x64_3.1.2_core |
| 7.0 | Windows 10.0.14393 | win-8_x64_10.0.14393.0_7.0.0_x64_3.1.2_core |
| 7.0 | Windows 10.0.17763 | win-8_x64_10.0.17763.0_7.0.0_x64_3.1.2_core |
| 7.0 | Windows 10.0.18362 | win-4_x64_10.0.18362.0_7.0.0_x64_3.1.2_core |
다른 프로필은 GitHub 리포지토리찾을 수 있습니다.
PSCompatibilityCollector 모듈을 사용해 자신만의 플랫폼 프로필을 생성할 수도 있습니다.
호환성 설정 TargetProfiles은 . 각 대상 플랫폼을 다음과 같이 지정할 수 있습니다:
- 플랫폼 이름(예:
ubuntu_x64_18.04_6.1.1_x64_4.0.30319.42000_core). PSScriptAnalyzer는 기본 프로필 디렉터리에서 추가.json하고 검색합니다. - 파일명(예:
my_custom_platform.json)을 PSScriptAnalyzer가 기본 프로필 디렉터리에서 검색합니다. - 파일의 절대 경로(예:
D:\PowerShellProfiles\TargetMachine.json)입니다.
기본 프로필 디렉터리는 PSScriptAnalyzer 모듈 $PSScriptRoot/compatibility_profiles 아래에 있으며( $PSScriptRoot 여기서 는 를 포함하는 PSScriptAnalyzer.psd1디렉터리를 의미합니다).
호환성 분석은 사용하는 각 명령어를 타겟 프로필과 유니언 프로필 모두와 비교합니다. 유니언 프로필에는 프로필 디렉터리 내 모든 프로필에서 사용 가능한 모든 명령어가 포함되어 있습니다.
유니언 프로필에 명령어가 없으면, 규칙은 해당 명령어가 귀하의 환경에 해당한다고 가정하고 무시합니다. 명령어가 유니언 프로필에 있지만 타겟 프로필에 없으면, 규칙은 해당 타겟과 호환되지 않는다고 표시합니다.
본보기
다음 예시들은 (Ubuntu 18.04, PowerShell 6.2)를 포함한다고 TargetProfiles 가정 ubuntu_x64_18.04_6.2.4_x64_4.0.30319.42000_core 합니다.
비준수
function Get-OsInfo {
$os = Get-WmiObject -Class Win32_OperatingSystem
return $os.Caption
}
Compliant
function Get-OsInfo {
$os = Get-CimInstance -ClassName Win32_OperatingSystem
return $os.Caption
}
규칙 구성
@{
Rules = @{
PSUseCompatibleCommands = @{
Enable = $true
TargetProfiles = @(
'ubuntu_x64_18.04_6.1.3_x64_4.0.30319.42000_core'
'win-48_x64_10.0.17763.0_5.1.17763.316_x64_4.0.30319.42000_framework'
'MyProfile'
'another_custom_profile_in_the_profiles_directory.json'
'D:\My Profiles\profile1.json'
)
# You can specify commands to not check like this, which also will ignore its parameters:
IgnoreCommands = @(
'Install-Module'
)
}
}
}
Parameters
사용 가능하게 설정
이 매개변수는 스크립트애널라이더가 이 규칙에 따라 코드를 검사하는지 여부를 제어합니다. 불리언 값을 받아들입니다. 이 규칙을 활성화하려면 이 매개변수를 로 $true설정하세요. 기본값은 $false입니다.
목표프로필
이 매개변수는 호환성을 확인할 플랫폼 프로필 목록을 지정합니다. 문자열 배열을 허용합니다. 각 값은 플랫폼 이름, 파일명 또는 프로필 파일의 절대 경로일 수 있습니다. 기본값은 @()입니다.
프로필 디어패스
이 매개변수는 ScriptAnalyzer가 이름으로 프로필을 검색하고 유니언 프로필을 생성하는 데 사용하는 디렉터리를 제어합니다. 절대 경로를 포함하는 문자열을 받아들입니다. 기본 위치는 PSScriptAnalyzer 모듈의 디렉터리입니다 compatibility_profiles .
명령어 무시하기
이 매개변수는 호환성 검사에서 제외할 명령어를 지정합니다. 명령어 이름 문자열 배열을 받아들입니다. 기본값은 @()입니다.
진압
다른 규칙과 마찬가지로, 스크립트블록의 블록에 param 억제 속성을 추가하여 명령 호환성 진단을 억제할 수 있습니다.
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands', '')]
특정 명령어에 대해서는 규칙을 억제할 수도 있습니다:
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands',
'Start-Service')]
특정 매개변수에 대해서는 억제할 수도 있습니다:
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands',
'Import-Module/FullyQualifiedName')]