Compartir a través de


UseCompatibleTypes

Nivel de gravedad de : advertencia

Descripción

Esta regla identifica los tipos que no están disponibles (cargados de forma predeterminada) en las plataformas de PowerShell de destino.

Una plataforma de PowerShell se identifica con un nombre en el formato siguiente:

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

Dónde:

  • <os-name>: el nombre del sistema operativo en el que se ejecuta PowerShell. En Windows, esto incluye el número de SKU. En Linux, este es el nombre de la distribución.
  • <os-arch>: la arquitectura de máquina en la que se ejecuta el sistema operativo (normalmente se x64).
  • <os-version>: la versión autoinformó del sistema operativo (en Linux, esta es la versión de distribución).
  • <ps-version>: la versión de PowerShell (de $PSVersionTable.PSVersion).
  • <ps-arch>: la arquitectura de máquina del proceso de PowerShell.
  • <dotnet-version>: la versión notificada de PowerShell en tiempo de ejecución de .NET se ejecuta (desde System.Environment.Version).
  • <dotnet-edition>: PowerShell del tipo de tiempo de ejecución de .NET se está ejecutando (actualmente framework o core).

Por ejemplo:

  • win-4_x64_10.0.18312.0_5.1.18312.1000_x64_4.0.30319.42000_framework es PowerShell 5.1 que se ejecuta en Windows 10 Enterprise (compilación 18312) para x64.
  • win-4_x64_10.0.18312.0_6.1.2_x64_4.0.30319.42000_core es PowerShell 6.1.2 que se ejecuta en el mismo sistema operativo.
  • ubuntu_x64_18.04_6.2.0_x64_4.0.30319.42000_core es PowerShell 6.2.0 que se ejecuta en Ubuntu 18.04.

Algunas plataformas se incluyen con PSScriptAnalyzer como archivos JSON, denominados de esta manera para dirigirse a la configuración.

Las plataformas agrupadas de forma predeterminada son:

Versión de PowerShell Sistema operativo IDENTIFICACIÓN
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 Pro 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

Puede encontrar otros perfiles en el repositorio de GitHub de .

También puede generar su propio perfil de plataforma mediante el módulo PSCompatibilityCollector de .

La configuración del perfil de compatibilidad toma una lista de plataformas de destino en TargetProfiles. Se puede especificar una plataforma como:

  • Nombre de la plataforma (como ubuntu_x64_18.04_6.1.1_x64_4.0.30319.42000_core), que tendrá .json agregado al final y se buscará en el directorio de perfil predeterminado.
  • Un nombre de archivo (como my_custom_platform.json), que se buscará en el directorio de perfil predeterminado.
  • Ruta de acceso absoluta a un archivo (como D:\PowerShellProfiles\TargetMachine.json).

El directorio de perfil predeterminado está en el módulo PSScriptAnalzyer en $PSScriptRoot/PSCompatibilityCollector/profiles (donde $PSScriptRoot aquí hace referencia al directorio que contiene PSScriptAnalyzer.psd1).

El análisis de compatibilidad compara un tipo usado para un perfil de destino y un perfil de "unión" (que contiene todos los tipos disponibles en cualquier perfil de en el dir de perfil). Si un tipo no está presente en el perfil de unión, se supone que se crea y se omite localmente. De lo contrario, si un tipo está presente en el perfil de unión, pero no está presente en un destino, se considera incompatible con ese destino.

Configuración

Clave de configuración Significado Valores aceptados Obligatorio Ejemplo
Enable Activa la regla bool ($true/$false) No (valor predeterminado: $false) $true
TargetProfiles La lista de perfiles de PowerShell que se van a dirigir string[]: rutas de acceso absolutas a archivos de perfil o nombres de perfiles en el directorio de perfiles No (valor predeterminado: @()) @('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 Ubicación que se va a buscar perfiles por nombre y uso para la generación de perfiles de unión string: ruta de acceso absoluta al nuevo dir de perfil No (el valor predeterminado es compatibility_profiles directorio en el módulo PSScriptAnalyzer C:\Users\me\Documents\pssaCompatProfiles
IgnoreTypes Nombres completos de tipos o aceleradores de tipos para omitir la compatibilidad de en scripts string[]: nombres de tipos que se van a omitir No (valor predeterminado: @()) @('System.Collections.ArrayList','string')

Una configuración de ejemplo podría ser similar a la siguiente:

@{
    Rules = @{
        PSUseCompatibleTypes = @{
            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 types to not check like this, which will also ignore methods and members on it:
            IgnoreTypes = @(
                'System.IO.Compression.ZipFile'
            )
        }
    }
}

Como alternativa, puede proporcionar un objeto de configuración de la siguiente manera:

PS> $settings = @{
      Rules = @{
        PSUseCompatibleTypes = @{
          Enable = $true
          TargetProfiles = @('win-48_x64_10.0.17763.0_5.1.17763.316_x64_4.0.30319.42000_framework')
        }
      }
}
PS> Invoke-ScriptAnalyzer -Settings $settings -ScriptDefinition "[System.Management.Automation.SemanticVersion]'1.18.0-rc1'"

RuleName                Severity     ScriptName Line  Message
--------                --------     ---------- ----  -------
PSUseCompatibleTypes    Warning                 1     The type 'System.Management.Automation.SemanticVersion' is
                                                      not available by default in PowerShell version
                                                      '5.1.17763.316' on platform 'Microsoft Windows 10 Pro'

Supresión

Los diagnósticos de compatibilidad de comandos se pueden suprimir con un atributo en el bloque param de un scriptblock como con otras reglas.

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

La regla también se puede suprimir solo para determinados tipos:

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleTypes',
    'System.Management.Automation.Security.SystemPolicy')]

Y también se suprime solo para los miembros de tipo:

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseCompatibleCommands',
    'System.Management.Automation.LanguagePrimitives/ConvertTypeNameToPSTypeName')]