Informazioni sulle edizioni di PowerShellAbout PowerShell Editions

Descrizione breveShort Description

Edizioni diverse di PowerShell vengono eseguite in diversi runtime sottostanti.Different editions of PowerShell run on different underlying runtimes.

Descrizione lungaLong Description

Da PowerShell 5,1 sono presenti più edizioni di PowerShell eseguite in un Runtime .NET diverso.From PowerShell 5.1, there are multiple editions of PowerShell that each run on a different .NET runtime. A partire da PowerShell 6,2 sono disponibili due edizioni di PowerShell:As of PowerShell 6.2 there are two editions of PowerShell:

  • Desktop , che viene eseguito in .NET Framework.Desktop , which runs on .NET Framework. PowerShell 4 e versioni precedenti, oltre a PowerShell 5,1 nelle edizioni complete di Windows, ad esempio Windows desktop, Windows Server, Windows Server Core e la maggior parte degli altri sistemi operativi Windows sono Desktop Edition.PowerShell 4 and below, as well as PowerShell 5.1 on full-featured Windows editions like Windows Desktop, Windows Server, Windows Server Core and most other Windows operating systems are Desktop edition. Si tratta dell'edizione originale di PowerShell.This is the original PowerShell edition.
  • Core , che viene eseguito in .NET Core.Core , which runs on .NET Core. PowerShell 6,0 e versioni successive, oltre a PowerShell 5,1 in alcune edizioni di Windows con footprint ridotto, ad esempio Windows nano server e Windows Internet, in cui .NET Framework non è disponibile.PowerShell 6.0 and above, as well as PowerShell 5.1 on some reduced-footprint Windows editions such as Windows Nano Server and Windows IoT where .NET Framework is unavailable.

Poiché l'edizione di PowerShell corrisponde al runtime .NET, è l'indicatore principale dell'API .NET e della compatibilità dei moduli di PowerShell. Alcune API, tipi o metodi .NET non sono disponibili in entrambi i Runtime .NET e ciò influiscono sugli script e sui moduli di PowerShell che dipendono da essi.Because the edition of PowerShell corresponds to its .NET runtime, it is the primary indicator of .NET API and PowerShell module compatibility; some .NET APIs, types or methods are not available in both .NET runtimes and this affects PowerShell scripts and modules that depend on them.

$PSEditionVariabile automaticaThe $PSEdition automatic variable

In PowerShell 5,1 e versioni successive è possibile scoprire l'edizione in esecuzione con la $PSEdition variabile automatica:In PowerShell 5.1 and above, you can find out what edition you are running with the $PSEdition automatic variable:

$PSEdition
Core

In PowerShell 4 e versioni precedenti questa variabile non esiste.In PowerShell 4 and below, this variable does not exist. $PSEdition il valore null deve essere considerato uguale al valore di Desktop .$PSEdition being null should be treated as the same as having the value Desktop.

Edizione in $PSVersionTableEdition in $PSVersionTable

La $PSVersionTable variabile automatica include anche informazioni sull'edizione in PowerShell 5,1 e versioni successive:The $PSVersionTable automatic variable also has edition information in PowerShell 5.1 and above:

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      6.2.0-rc.1
PSEdition                      Core           # <-- Edition information
GitCommitId                    6.2.0-rc.1
OS                             Microsoft Windows 10.0.18865
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Il PSEdition campo avrà lo stesso valore della $PSEdition variabile automatica.The PSEdition field will have the same value as the $PSEdition automatic variable.

Il CompatiblePSEditions campo del manifesto del moduloThe CompatiblePSEditions module manifest field

I moduli di PowerShell possono dichiarare quali edizioni di PowerShell sono compatibili con l'uso del CompatiblePSEditions campo del manifesto del modulo.PowerShell modules can declare what editions of PowerShell they are compatible with using the CompatiblePSEditions field of the module manifest.

Ad esempio, un manifesto del modulo che dichiara la compatibilità con le Desktop Core edizioni di e di PowerShell:For example, a module manifest declaring compatibility with both Desktop and Core editions of PowerShell:

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop', 'Core')
}

Esempio di manifesto del modulo con compatibilità unica Desktop :An example of a module manifest with only Desktop compatibility:

@{
    ModuleVersion = '1.0'
    FunctionsToExport = @('Test-MyModule')
    CompatiblePSEditions = @('Desktop')
}

L'omissione del CompatiblePSEditions campo da un manifesto del modulo avrà lo stesso effetto dell'impostazione su Desktop , perché i moduli creati prima dell'introduzione di questo campo sono stati scritti in modo implicito per questa edizione.Omitting the CompatiblePSEditions field from a module manifest will have the same effect as setting it to Desktop, since modules created before this field was introduced were implicitly written for this edition.

Per i moduli non spediti come parte di Windows (ad esempio, moduli scritti o installati dalla raccolta), questo campo è solo informativo. PowerShell non modifica il comportamento in base al CompatiblePSEditions campo, ma lo espone nell' PSModuleInfo oggetto (restituito da Get-Module ) per la logica:For modules not shipped as part of Windows (i.e. modules you write or install from the gallery), this field is informational only; PowerShell does not change behavior based on the CompatiblePSEditions field, but does expose it on the PSModuleInfo object (returned by Get-Module) for your own logic:

New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion '5.1'
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core

Nota

Il CompatiblePSEditions campo del modulo è compatibile solo con PowerShell 5,1 e versioni successive.The CompatiblePSEditions module field is only compatible with PowerShell 5.1 and above. L'inclusione di questo campo provocherà l'incompatibilità di un modulo con PowerShell 4 e versioni precedenti.Including this field will cause a module to be incompatible with PowerShell 4 and below. Poiché il campo è puramente informativo, può essere tranquillamente omesso nelle versioni successive di PowerShell.Since the field is purely informational, it can be safely omitted in later PowerShell versions.

In PowerShell 6,1, il Get-Module -ListAvailable formattatore è stato aggiornato per visualizzare la compatibilità delle edizioni di ogni modulo:In PowerShell 6.1, Get-Module -ListAvailable has had its formatter updated to display the edition-compatibility of each module:

Get-Module -ListAvailable

    Directory: C:\Users\me\Documents\PowerShell\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Script     1.4.0      Az                                  Core,Desk
Script     1.3.1      Az.Accounts                         Core,Desk {Disable-AzDataCollection, Disable-AzContextAutosave, E...
Script     1.0.1      Az.Aks                              Core,Desk {Get-AzAks, New-AzAks, Remove-AzAks, Import-AzAksCreden...

...

Script     4.4.0      Pester                              Desk      {Describe, Context, It, Should...}
Script     1.18.0     PSScriptAnalyzer                    Desk      {Get-ScriptAnalyzerRule, Invoke-ScriptAnalyzer, Invoke-...
Script     1.0.0      WindowsCompatibility                Core      {Initialize-WinSession, Add-WinFunction, Invoke-WinComm...

Compatibilità delle edizioni per i moduli forniti come parte di WindowsEdition-compatibility for modules that ship as part of Windows

Per i moduli che fanno parte di Windows (o sono installati come parte di un ruolo o una funzionalità), PowerShell 6,1 e versioni successive considerano il CompatiblePSEditions campo in modo diverso.For modules that come as part of Windows (or are installed as part of a role or feature), PowerShell 6.1 and above treat the CompatiblePSEditions field differently. Tali moduli si trovano nella directory dei moduli di sistema di Windows PowerShell ( %windir%\System\WindowsPowerShell\v1.0\Modules ).Such modules are found in the Windows PowerShell system modules directory (%windir%\System\WindowsPowerShell\v1.0\Modules).

Per i moduli caricati o trovati in questa directory, PowerShell 6,1 e versioni successive usano il CompatiblePSEditions campo per determinare se il modulo sarà compatibile con la sessione corrente e si comporta di conseguenza.For modules loaded from or found in this directory, PowerShell 6.1 and above uses the CompatiblePSEditions field to determine whether the module will be compatible with the current session and behaves accordingly.

Quando Import-Module si utilizza, un modulo senza Core in CompatiblePSEditions non verrà importato e verrà visualizzato un errore:When Import-Module is used, a module without Core in CompatiblePSEditions will not be imported and an error will be displayed:

Import-Module BitsTransfer
Import-Module : Module 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\BitsTransfer\BitsTransfer.psd1' does not support current PowerShell edition 'Core'. Its supported editions are 'Desktop'. Use 'Import-Module -SkipEditionCheck' to ignore the compatibility of this module.
At line:1 char:1
+ Import-Module BitsTransfer
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (C:\WINDOWS\system32\u2026r\BitsTransfer.psd1:String) [Import-Module], InvalidOperationException
+ FullyQualifiedErrorId : Modules_PSEditionNotSupported,Microsoft.PowerShell.Commands.ImportModuleCommand

Quando Get-Module -ListAvailable si usa, i moduli senza Core in CompatiblePSEditions non verranno visualizzati:When Get-Module -ListAvailable is used, modules without Core in CompatiblePSEditions will not be displayed:

Get-Module -ListAvailable BitsTransfer
# No output

In entrambi i casi, -SkipEditionCheck è possibile usare il parametro switch per eseguire l'override di questo comportamento:In both cases, the -SkipEditionCheck switch parameter can be used to override this behavior:

Get-Module -ListAvailable -SkipEditionCheck BitsTransfer

    Directory: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Manifest   2.0.0.0    BitsTransfer                        Desk      {Add-BitsFile, Complete-BitsTransfer, Get-BitsTransfer,...

Avviso

Import-Module -SkipEditionCheck potrebbe sembrare avere esito positivo per un modulo, ma l'uso di tale modulo corre il rischio di riscontrare un'incompatibilità in un secondo momento. Quando il caricamento del modulo ha inizialmente esito positivo, un comando può chiamare in un secondo momento un'API incompatibile e non riuscire spontaneamente.Import-Module -SkipEditionCheck may appear to succeed for a module, but using that module runs the risk of encountering an incompatibility later on; while loading the module initially succeeds, a command may later call an incompatible API and fail spontaneously.

Creazione di moduli di PowerShell per la compatibilità incrociata edizioneAuthoring PowerShell modules for edition cross-compatibility

Quando si scrive un modulo di PowerShell per la destinazione di entrambe Desktop Core le edizioni e di PowerShell, è possibile garantire la compatibilità tra più edizioni.When writing a PowerShell module to target both Desktop and Core editions of PowerShell, there are things you can do to ensure cross-edition compatibility.

L'unico modo vero per verificare e convalidare continuamente la compatibilità consiste nel scrivere test per lo script o il modulo ed eseguirli in tutte le versioni e le edizioni di PowerShell per cui è necessaria la compatibilità.The only true way to confirm and continually validate compatibility however is to write tests for your script or module and run them on all versions and editions of PowerShell you need compatibility with. Un Framework di test consigliato è Pester.A recommended testing framework for this is Pester.

Script PowerShellPowerShell script

Come linguaggio, PowerShell funziona allo stesso modo tra le edizioni. sono i cmdlet, i moduli e le API .NET usati che sono interessati dalla compatibilità dell'edizione.As a language, PowerShell works the same between editions; it is the cmdlets, modules and .NET APIs you use that are affected by edition compatibility.

In genere, gli script che funzionano in PowerShell 6,1 e versioni successive funzioneranno con Windows PowerShell 5,1, ma vi sono alcune eccezioni.Generally, scripts that work in PowerShell 6.1 and above will work with Windows PowerShell 5.1, but there are some exceptions.

Il modulo Version 1.18.0 PSScriptAnalyzer include regole come PSUseCompatibleCommands e PSUseCompatibleTypes che sono in grado di rilevare l'utilizzo probabilmente incompatibile di comandi e API .NET negli script di PowerShell.Version 1.18.0 PSScriptAnalyzer module has rules like PSUseCompatibleCommands and PSUseCompatibleTypes that are able to detect possibly incompatible usage of commands and .NET APIs in PowerShell scripts.

assembly .NET.NET assemblies

Se si sta scrivendo un modulo binario o un modulo che incorpora gli assembly .NET (dll) generati dal codice sorgente, è necessario compilare con .NET standard e PowerShell standard per la convalida della compatibilità delle API .NET e PowerShell in fase di compilazione.If you are writing a binary module or a module that incorporates .NET assemblies (DLLs) generated from source code, you should compile against .NET Standard and PowerShell Standard for compile-time compatibility validation of .NET and PowerShell API compatibility.

Sebbene queste librerie siano in grado di verificare una certa compatibilità in fase di compilazione, non saranno in grado di rilevare possibili differenze di comportamento tra le edizioni.Although these libraries are able to check some compatibility at compile time, they won't be able to catch possible behavioral differences between editions. A tale proposito, è comunque necessario scrivere i test.For this you must still write tests.

Vedere ancheSee also