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.
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