Freigeben über


UseCompatibleCommands

Schweregrad: Warnung

BESCHREIBUNG

Diese Regel identifiziert Befehle, die auf einer Bestimmten PowerShell-Plattform nicht verfügbar sind.

Eine PowerShell-Plattform wird durch einen Namen im folgenden Format identifiziert:

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

Hierbei gilt:

  • <os-name>: Der Name des Betriebssystems, unter dem PowerShell ausgeführt wird. Unter Windows schließt dies die SKU-Nummer ein. Unter Linux ist dies der Name der Distribution.
  • <os-arch>: Die Computerarchitektur, auf der das Betriebssystem ausgeführt wird (normalerweise x64).
  • <os-version>: Die selbst gemeldete Version des Betriebssystems (unter Linux ist dies die Verteilungsversion).
  • <ps-version>: Die PowerShell-Version (von $PSVersionTable.PSVersion).
  • <ps-arch>: Die Computerarchitektur des PowerShell-Prozesses.
  • <dotnet-version>: Die gemeldete Version der .NET-Runtime, die PowerShell unter (von System.Environment.Version) ausgeführt wird.
  • <dotnet-edition>: Der .NET-Laufzeitgeschmack, in dem PowerShell ausgeführt wird (derzeit framework oder core).

Beispiel:

  • win-4_x64_10.0.18312.0_5.1.18312.1000_x64_4.0.30319.42000_frameworkwird PowerShell 5.1 auf Windows 10 Enterprise (Build 18312) für x64 ausgeführt.
  • win-4_x64_10.0.18312.0_6.1.2_x64_4.0.30319.42000_core ist PowerShell 6.1.2, die unter demselben Betriebssystem ausgeführt wird.
  • ubuntu_x64_18.04_6.2.0_x64_4.0.30319.42000_core ist PowerShell 6.2.0, die unter Ubuntu 18.04 ausgeführt wird.

Einige Plattformen werden mit PSScriptAnalyzer als JSON-Dateien gebündelt, die auf diese Weise für die Ausrichtung in Ihrer Konfiguration benannt werden.

Standardmäßig gebündelte Plattformen sind:

PowerShell-Version Betriebssystem 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 2012R2 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 1809 (RS5) win-48_x64_10.0.17763.0_5.1.17763.316_x64_4.0.30319.42000_framework
6.2 Windows Server 2016 win-8_x64_10.0.14393.0_6.2.4_x64_4.0.30319.42000_core
6.2 Windows Server 2019 win-8_x64_10.0.17763.0_6.2.4_x64_4.0.30319.42000_core
6.2 Windows 10 1809 (RS5) win-4_x64_10.0.17763.0_6.2.4_x64_4.0.30319.42000_core
6.2 Ubuntu 18.04 LTS ubuntu_x64_18.04_6.2.4_x64_4.0.30319.42000_core
7.0 Windows Server 2016 win-8_x64_10.0.14393.0_7.0.0_x64_3.1.2_core
7.0 Windows Server 2019 win-8_x64_10.0.17763.0_7.0.0_x64_3.1.2_core
7.0 Windows 10 1809 (RS5) win-4_x64_10.0.17763.0_6.2.4_x64_3.1.2_core
7.0 Ubuntu 18.04 LTS ubuntu_x64_18.04_7.0.0_x64_3.1.2_core

Weitere Profile finden Sie im GitHub-Repository.

Sie können auch ihr eigenes Plattformprofil mit dem Modul PSCompatibilityCollector generieren.

Die Kompatibilitätsprofileinstellungen verwenden eine Liste der Plattformen, die unter als Ziel festgelegt werden TargetProfilessollen. Eine Plattform kann wie folgt angegeben werden:

  • Ein Plattformname (z. B. ubuntu_x64_18.04_6.1.1_x64_4.0.30319.42000_core), der am Ende hinzugefügt wurde .json und im Standardprofilverzeichnis gesucht wird.
  • Ein Dateiname (wie my_custom_platform.json), der im Standardprofilverzeichnis nach gesucht wird.
  • Ein absoluter Pfad zu einer Datei (z. B D:\PowerShellProfiles\TargetMachine.json. ).

Das Standardprofilverzeichnis befindet sich unter dem PSScriptAnalzyer-Modul unter $PSScriptRoot/compatibility_profiles (wobei $PSScriptRoot sich hier auf das Verzeichnis bezieht, das enthält PSScriptAnalyzer.psd1.

Die Kompatibilitätsanalyse vergleicht einen Befehl, der sowohl mit einem Zielprofil als auch mit einem Union-Profil verwendet wird (mit allen Befehlen, die in einem beliebigen Profil im Profilverzeichnis verfügbar sind). Wenn ein Befehl im Union-Profil nicht vorhanden ist, wird davon ausgegangen, dass er lokal erstellt und ignoriert wird. Andernfalls gilt ein Befehl, wenn er im Union-Profil vorhanden ist, aber nicht in einem Ziel vorhanden ist, als mit diesem Ziel nicht kompatibel.

Konfigurationseinstellungen

Konfigurationsschlüssel Bedeutung Zulässige Werte Obligatorisch. Beispiel
Enable Aktiviert die Regel bool ($true/$false) Nein (Standard: $false) $true
TargetProfiles Die Liste der PowerShell-Profile, die als Ziel verwendet werden sollen string[]: absolute Pfade zu Profildateien oder Namen von Profilen im Profilverzeichnis Nein (Standard: @()) @('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 Der Speicherort für die Suche nach Profilen nach Name und Verwendung für die Generierung von Gewerkschaftsprofilen string: absoluter Pfad zum neuen Profilverzeichnis Nein (standardmäßig verzeichnis compatibility_profiles im PSScriptAnalyzer-Modul C:\Users\me\Documents\pssaCompatProfiles
IgnoreCommands Befehle, um die Kompatibilität von in Skripts zu ignorieren string[]: Namen zu ignorierenden Befehlen Nein (Standard: @()) @('Get-ChildItem','Import-Module')

Eine Beispielkonfiguration könnte wie folgt aussehen:

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

Unterdrückung

Die Befehlskompatibilität Diagnose kann mit einem Attribut für den param Block eines Skriptblocks wie bei anderen Regeln unterdrückt werden.

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

Die Regel kann auch nur für bestimmte Befehle unterdrückt werden:

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

Und auch nur für Parameter unterdrückt:

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