Condividi tramite


Moduli con edizioni di PowerShell compatibili

A partire dalla versione 5.1, PowerShell è disponibile in diverse edizioni, che denotano diversi set di funzionalità e compatibilità con la piattaforma.

  • Edizione desktop: Basato su .NET Framework, si applica a Windows PowerShell v4.0 e versioni precedenti, nonché a Windows PowerShell 5.1 su Windows Desktop, Windows Server, Windows Server Core e la maggior parte delle altre edizioni di Windows.
  • Edizione principale: Basato su .NET Core, si applica a PowerShell 6.0 e versioni successive, nonché a Windows PowerShell 5.1 nelle edizioni di Windows con footprint ridotto, ad esempio Windows IoT e Windows Nano Server.

Per altre informazioni sulle edizioni di PowerShell, vedere about_PowerShell_Editions.

Dichiarazione delle edizioni compatibili

Gli autori dei moduli possono dichiarare i moduli come compatibili con una o più edizioni di PowerShell usando la chiave del manifesto del CompatiblePSEditions modulo. Questa chiave è supportata solo in PowerShell 5.1 o versione successiva.

Annotazioni

Una volta specificato un manifesto del modulo con la CompatiblePSEditions chiave o usato la $PSEdition variabile, non può essere importato in PowerShell v4 o versioni precedenti.

New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion 5.1
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
$ModuleInfo | Get-Member CompatiblePSEditions
   TypeName: System.Management.Automation.PSModuleInfo

Name                 MemberType Definition
----                 ---------- ----------
CompatiblePSEditions Property   System.Collections.Generic.IEnumerable[string] CompatiblePSEditions {get;}

Quando si ottiene un elenco di moduli disponibili, è possibile filtrare l'elenco in base all'edizione di PowerShell.

Get-Module -ListAvailable -PSEdition Desktop
    Directory: C:\Program Files\WindowsPowerShell\Modules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0        ModuleWithPSEditions
Get-Module -ListAvailable -PSEdition Core | % CompatiblePSEditions
Desktop
Core

A partire da PowerShell 6, il valore viene usato per decidere se un modulo è compatibile quando i CompatiblePSEditions moduli vengono importati da $env:windir\System32\WindowsPowerShell\v1.0\Modules. Questo comportamento si applica solo a Windows. Al di fuori di questo scenario, il valore viene utilizzato solo come metadati.

Ricerca di moduli compatibili

Gli utenti di PowerShell Gallery possono trovare l'elenco dei moduli supportati in una specifica edizione di PowerShell usando i tag PSEdition_Desktop e PSEdition_Core.

Si ritiene che i moduli senza PSEdition_Desktop e PSEdition_Core tag funzionino correttamente nelle edizioni desktop di PowerShell.

# Find modules supported on PowerShell Desktop edition
Find-Module -Tag PSEdition_Desktop

# Find modules supported on PowerShell Core editions
Find-Module -Tag PSEdition_Core

Targeting di più edizioni

Gli autori dei moduli possono pubblicare un singolo modulo destinato a una o entrambe le edizioni di PowerShell (Desktop e Core).

Un singolo modulo può funzionare sia sull'edizione Desktop che su quella Core, in quel modulo l'autore deve aggiungere la logica richiesta in RootModule o nel manifesto del modulo utilizzando $PSEdition la variabile. I moduli possono avere due set di DLL compilate destinate sia a CoreCLR che a FullCLR. Di seguito sono riportate le opzioni di creazione dei pacchetti con la logica per il caricamento delle DLL corrette.

Opzione 1: Creazione del pacchetto di un modulo per la destinazione di più versioni e più edizioni di PowerShell

Contenuto della cartella del modulo

  • Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • PSScriptAnalyzer.psd1
  • PSScriptAnalyzer.psm1
  • ScriptAnalyzer.format.ps1xml
  • ScriptAnalyzer.types.ps1xml
  • \Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • \Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • en-US\about_PSScriptAnalyzer.help.txt
  • en-US\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll-Help.xml
  • PSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules.dll
  • PSv3\Microsoft.Windows.PowerShell.ScriptAnalyzer.dll
  • Impostazioni\CmdletDesign.psd1
  • Impostazioni\DSC.psd1
  • Impostazioni\ScriptFunctions.psd1
  • Impostazioni\ScriptingStyle.psd1
  • Impostazioni\ScriptSecurity.psd1

Contenuto del PSScriptAnalyzer.psd1 file

@{

# Author of this module
Author = 'Microsoft Corporation'

# Script module or binary module file associated with this manifest.
RootModule = 'PSScriptAnalyzer.psm1'

# Version number of this module.
ModuleVersion = '1.6.1'

# ---
}

La logica seguente carica gli assembly necessari a seconda dell'edizione o della versione corrente.

Contenuto del PSScriptAnalyzer.psm1 file:

#
# Script module for module 'PSScriptAnalyzer'
#
Set-StrictMode -Version Latest

# Set up some helper variables to make it easier to work with the module
$PSModule = $ExecutionContext.SessionState.Module
$PSModuleRoot = $PSModule.ModuleBase

# Import the appropriate nested binary module based on the current PowerShell version
$binaryModuleRoot = $PSModuleRoot


if (($PSVersionTable.Keys -contains "PSEdition") -and ($PSVersionTable.PSEdition -ne 'Desktop')) {
    $binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'coreclr'
}
else
{
    if ($PSVersionTable.PSVersion -lt [Version]'5.0')
    {
        $binaryModuleRoot = Join-Path -Path $PSModuleRoot -ChildPath 'PSv3'
    }
}

$binaryModulePath = Join-Path -Path $binaryModuleRoot -ChildPath 'Microsoft.Windows.PowerShell.ScriptAnalyzer.dll'
$binaryModule = Import-Module -Name $binaryModulePath -PassThru

# When the module is unloaded, remove the nested binary module that was loaded with it
$PSModule.OnRemove = {
    Remove-Module -ModuleInfo $binaryModule
}

Opzione 2: utilizzare $PSEdition variabile nel file PSD1 per caricare le DLL corrette

In PS 5.1 o versioni successive, $PSEdition la variabile globale è consentita nel file manifesto del modulo. Utilizzando questa variabile, l'autore del modulo può specificare i valori condizionali nel file manifesto del modulo. $PSEdition può essere referenziata in modalità lingua limitata o in una sezione Dati.

File manifesto del modulo di esempio con CompatiblePSEditions chiave.

@{
    # Script module or binary module file associated with this manifest.
    RootModule = if($PSEdition -eq 'Core')
    {
        'coreclr\MyCoreClrRM.dll'
    }
    else # Desktop
    {
        'clr\MyFullClrRM.dll'
    }

    # Supported PSEditions
    CompatiblePSEditions = 'Desktop', 'Core'

    # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
    NestedModules = if($PSEdition -eq 'Core')
    {
        'coreclr\MyCoreClrNM1.dll',
        'coreclr\MyCoreClrNM2.dll'
    }
    else # Desktop
    {
        'clr\MyFullClrNM1.dll',
        'clr\MyFullClrNM2.dll'
    }
}

Contenuto del modulo

  • ModuleWithEditions\ModuleWithEditions.psd1
  • ModuleWithEditions\clr\MyFullClrNM1.dll
  • ModuleWithEditions\clr\MyFullClrNM2.dll
  • ModuleWithEditions\clr\MyFullClrRM.dll
  • ModuleWithEditions\coreclr\MyCoreClrNM1.dll
  • ModuleWithEditions\coreclr\MyCoreClrNM2.dll
  • ModuleWithEditions\coreclr\MyCoreClrRM.dll

Altri dettagli

Script con PSEditions

Supporto di PSEditions in PowerShellGallery

Aggiorna manifesto del modulo

about_PowerShell_Editions