UseCompatibleCommands

严重性级别:警告

描述

此规则标识在目标 PowerShell 平台上不可用的命令。

PowerShell 平台按以下格式的名称进行标识:

<os-name>_<os-arch>_<os-version>_<ps-version>_<ps-arch>_<dotnet-version>_<dotnet-edition>

哪里:

  • <os-name>:运行操作系统 PowerShell 的名称。 在 Windows 上,这包括 SKU 编号。 在 Linux 上,这是分发的名称。
  • <os-arch>:运行操作系统的计算机体系结构(这通常是 x64)。
  • <os-version>:操作系统的自报告版本(在 Linux 上,这是分发版本)。
  • <ps-version>:PowerShell 版本($PSVersionTable.PSVersion)。
  • <ps-arch>:PowerShell 进程的计算机体系结构。
  • <dotnet-version>:.NET 运行时 PowerShell 的报告版本正在运行(从 System.Environment.Version运行)。
  • <dotnet-edition>:运行 .NET 运行时风格 PowerShell(当前 frameworkcore)。

例如:

  • win-4_x64_10.0.18312.0_5.1.18312.1000_x64_4.0.30319.42000_framework 是适用于 x64 的 Windows 10 企业版(内部版本 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_core 是在 Ubuntu 18.04 上运行的 PowerShell 6.2.0。

某些平台与 PSScriptAnalyzer 捆绑为 JSON 文件,以这种方式命名以在配置中为目标。

默认情况下捆绑的平台为:

PowerShell 版本 操作系统 ID
3.0 Windows Server 2012 win-8_x64_6.2.9200.0_3.0_x64_4.0.30319.42000_framework
4.0 Windows Server 2012 R2 win-8_x64_6.3.9600.0_4.0_x64_4.0.30319.42000_framework
5.1 Windows Server 2016 win-8_x64_10.0.14393.0_5.1.14393.2791_x64_4.0.30319.42000_framework
5.1 Windows Server 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),它将 .json 添加到末尾,并在默认配置文件目录中搜索。
  • 文件名(如 my_custom_platform.json),将在默认配置文件目录中搜索该文件。
  • 文件的绝对路径(如 D:\PowerShellProfiles\TargetMachine.json)。

默认配置文件目录位于 $PSScriptRoot/compatibility_profiles PSScriptAnalzyer 模块下(此处 $PSScriptRoot 引用包含 PSScriptAnalyzer.psd1的目录)。

兼容性分析比较了一个用于目标配置文件和“联合”配置文件的命令(包含配置文件 dir 中任何 配置文件 中可用的所有命令)。 如果联合配置文件中不存在命令,则假定该命令在本地创建并忽略。 否则,如果联合配置文件中存在命令但目标中不存在,则它被视为与该目标不兼容。

配置设置

配置密钥 意义 接受的值 命令的
Enable 激活规则 bool ($true/$false 否(默认值:$false $true
TargetProfiles 要面向的 PowerShell 配置文件列表 string[]: 配置文件文件的绝对路径或配置文件目录中配置文件的名称 否(默认值:@() @('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')
ProfileDirPath 按名称搜索配置文件的位置,并用于联合配置文件生成 string:新配置文件 dir 的绝对路径 否(默认为 PSScriptAnalyzer 模块中的 compatibility_profiles 目录 C:\Users\me\Documents\pssaCompatProfiles
IgnoreCommands 用于忽略脚本中兼容性的命令 string[]: 要忽略的命令的名称 否(默认值:@() @('Get-ChildItem','Import-Module')

示例配置可能如下所示:

@{
    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'
            )
        }
    }
}

抑制

可以使用脚本块 param 块上的属性与其他规则一样取消命令兼容性诊断。

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands', '')]

也可以仅对特定命令取消该规则:

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands',
    'Start-Service')]

还仅对参数取消显示:

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands',
    'Import-Module/FullyQualifiedName')]