Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Breve descrizione
Diverse edizioni di PowerShell vengono eseguite in runtime sottostanti diversi.
Descrizione lunga
Da PowerShell 5.1 sono disponibili più edizioni di PowerShell eseguite in un runtime .NET diverso. A partire da PowerShell 6.0 sono disponibili due edizioni di PowerShell:
- Desktop, che viene eseguito in .NET Framework. PowerShell 4 e versioni successive, oltre a PowerShell 5.1 sono disponibili per edizioni di Windows complete come Desktop di Windows, Windows Server, Windows Server Core e la maggior parte degli altri sistemi operativi Windows. Questa è l'edizione originale di PowerShell ed è inclusa nell'installazione predefinita del sistema operativo.
- Core, che viene eseguito in .NET Core. PowerShell 6.0 e versioni successive è installato side-by-side con le versioni precedenti di PowerShell nelle edizioni di Windows complete, alcune edizioni di Windows con footprint ridotto, ad esempio Windows Nano Server e Windows IoT, o su piattaforme non Windows come Linux e macOS.
Poiché l'edizione di PowerShell corrisponde al runtime .NET, è l'indicatore principale della compatibilità dell'API .NET e del modulo PowerShell; alcune API .NET, tipi o metodi non sono disponibili sia in runtime .NET che influiscono su script e moduli di PowerShell che dipendono da essi.
Variabile $PSEdition automatica
In PowerShell 5.1 e versioni successive è possibile scoprire l'edizione in esecuzione con la variabile automatica $PSEdition:
$PSEdition
Core
In PowerShell 4 e versioni successive questa variabile non esiste.
$PSEdition essere null deve essere considerato uguale a quello del valore Desktop.
Edizione in $PSVersionTable
La variabile automatica $PSVersionTable include anche proprietà PSEdition in PowerShell 5.1 e versioni successive:
$PSVersionTable
Name Value
---- -----
PSVersion 7.3.9
PSEdition Core
GitCommitId 7.3.9
OS Microsoft Windows 10.0.22621
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
Il campo PSEdition ha lo stesso valore della variabile automatica $PSEdition.
Campo manifesto del CompatiblePSEditions modulo
I moduli di PowerShell possono dichiarare le edizioni di PowerShell compatibili con l'uso del campo CompatiblePSEditions del manifesto del modulo.
Ad esempio, un manifesto del modulo dichiara la compatibilità con Desktop e Core edizioni di PowerShell:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop', 'Core')
}
Esempio di manifesto di un modulo con solo Desktop compatibilità:
@{
ModuleVersion = '1.0'
FunctionsToExport = @('Test-MyModule')
CompatiblePSEditions = @('Desktop')
}
L'omissione del campo CompatiblePSEditions da un manifesto del modulo avrà lo stesso effetto di impostarlo su Desktop, poiché i moduli creati prima dell'introduzione di questo campo sono stati scritti in modo implicito per questa edizione.
Per i moduli non forniti come parte di Windows (ovvero i moduli scritti o installati dalla raccolta), questo campo è solo informativo; PowerShell non modifica il comportamento in base al campo CompatiblePSEditions, ma lo espone nell'oggetto PSModuleInfo (restituito da Get-Module) per la propria logica:
$newModuleManifestSplat = @{
Path = '.\TestModuleWithEdition.psd1'
CompatiblePSEditions = 'Desktop', 'Core'
PowerShellVersion = '5.1'
}
New-ModuleManifest @newModuleManifestSplat
$ModuleInfo = Test-ModuleManifest -Path .\TestModuleWithEdition.psd1
$ModuleInfo.CompatiblePSEditions
Desktop
Core
Nota
Il campo modulo CompatiblePSEditions è compatibile solo con PowerShell 5.1 e versioni successive. L'inclusione di questo campo causerà l'incompatibilità di un modulo con PowerShell 4 e versioni successive. Poiché il campo è puramente informativo, può essere omesso in modo sicuro nelle versioni successive di PowerShell.
In PowerShell 6.1, Get-Module -ListAvailable ha aggiornato il formattatore per visualizzare la compatibilità dell'edizione di ogni modulo:
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à dell'edizione per i moduli forniti come parte di Windows
Per i moduli inclusi in Windows (o installati come parte di un ruolo o di una funzionalità), PowerShell 6.1 e versioni successive considerano il campo CompatiblePSEditions in modo diverso. Tali moduli sono disponibili nella directory dei moduli di sistema di Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules).
Per i moduli caricati da o trovati in questa directory, PowerShell 6.1 e versioni successive usa il campo CompatiblePSEditions per determinare se il modulo sarà compatibile con la sessione corrente e si comporta di conseguenza.
Quando si usa Import-Module, un modulo senza Core in CompatiblePSEditions non verrà importato e verrà visualizzato un errore:
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 si usa Get-Module -ListAvailable, i moduli senza Core in CompatiblePSEditions non verranno visualizzati:
Get-Module -ListAvailable BitsTransfer
# No output
In entrambi i casi, il parametro switch -SkipEditionCheck può essere usato per eseguire l'override di questo comportamento:
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,...
Avvertimento
Import-Module -SkipEditionCheck potrebbe sembrare riuscita per un modulo, ma l'uso di tale modulo comporta il rischio di incompatibilità in un secondo momento; durante il caricamento iniziale del modulo ha esito positivo, un comando può in seguito chiamare un'API incompatibile e non riuscire spontaneamente.
Creazione di moduli di PowerShell per la compatibilità tra le edizioni
Quando si scrive un modulo di PowerShell come destinazione sia Desktop che Core edizioni di PowerShell, è possibile eseguire operazioni per garantire la compatibilità tra edizioni.
L'unico modo vero per confermare e convalidare continuamente la compatibilità consiste tuttavia nel scrivere test per lo script o il modulo ed eseguirli in tutte le versioni e edizioni di PowerShell con cui è necessaria la compatibilità. Un framework di test consigliato per questo è Pester.
Script di PowerShell
Come linguaggio, PowerShell funziona allo stesso modo tra le edizioni; si tratta dei cmdlet, dei moduli e delle API .NET usati che sono interessati dalla compatibilità dell'edizione.
In genere, gli script che funzionano in PowerShell 6.1 e versioni successive funzioneranno con Windows PowerShell 5.1, ma esistono alcune eccezioni.
PSScriptAnalyzer versione 1.18+ include regole come PSUseCompatibleCommands e PSUseCompatibleTypes in grado di rilevare l'uso potenzialmente incompatibile dei comandi e delle API .NET negli script di PowerShell.
Assembly .NET
Se si scrive un modulo binario o un modulo che incorpora gli assembly .NET (DLL) generati dal codice sorgente, è necessario eseguire la compilazione in base a .NET Standard e powerShell Standard per la convalida della compatibilità in fase di compilazione della compatibilità di .NET e api di PowerShell.
Anche se queste librerie sono in grado di verificare la compatibilità in fase di compilazione, non saranno in grado di intercettare le possibili differenze comportamentali tra le edizioni. Per questo motivo è comunque necessario scrivere test.
Vedere anche
- about_Automatic_Variables
- get-module
- import-module
- moduli con di edizioni di PowerShell compatibili