about_PowerShell_Editions

Descripción breve

Las distintas ediciones de PowerShell se ejecutan en distintos entornos de ejecución subyacentes.

Descripción larga

Desde PowerShell 5.1, hay varias ediciones de PowerShell que se ejecutan en un entorno de ejecución de .NET diferente. A partir de PowerShell 6.0 hay dos ediciones de PowerShell:

  • Escritorio, que se ejecuta en .NET Framework. PowerShell 4 y versiones posteriores, así como PowerShell 5.1 están disponibles para ediciones completas de Windows como Escritorio de Windows, Windows Server, Windows Server Core y la mayoría de los demás sistemas operativos Windows. Esta es la edición original de PowerShell y se incluye en la instalación predeterminada del sistema operativo.
  • Core, que se ejecuta en .NET Core. PowerShell 6.0 y versiones posteriores se instalan en paralelo con versiones anteriores de PowerShell en ediciones de Windows completas, algunas ediciones de Windows de superficie reducida, como Windows Nano Server y Windows IoT, o en plataformas que no son de Windows, como Linux y macOS.

Dado que la edición de PowerShell corresponde a su entorno de ejecución de .NET, es el indicador principal de compatibilidad con la API de .NET y el módulo de PowerShell; Algunas API de .NET, tipos o métodos no están disponibles en los entornos de ejecución de .NET y esto afecta a los scripts y módulos de PowerShell que dependen de ellos.

Variable $PSEdition automática

En PowerShell 5.1 y versiones posteriores, puede averiguar qué edición está ejecutando con la $PSEdition variable automática:

$PSEdition
Core

En PowerShell 4 y versiones posteriores, esta variable no existe. $PSEdition ser NULL debe tratarse como el mismo que tener el valor Desktop.

Edición en $PSVersionTable

La $PSVersionTable variable automática también tiene la propiedad PSEdition en PowerShell 5.1 y versiones posteriores:

$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

El campo PSEdition tiene el mismo valor que la $PSEdition variable automática.

Campo de manifiesto del CompatiblePSEditions módulo

Los módulos de PowerShell pueden declarar qué ediciones de PowerShell son compatibles con el uso del CompatiblePSEditions campo del manifiesto del módulo.

Por ejemplo, un manifiesto de módulo declarando compatibilidad con las Desktop ediciones y Core de PowerShell:

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

Un ejemplo de un manifiesto de módulo con solo Desktop compatibilidad:

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

La omisión del CompatiblePSEditions campo de un manifiesto de módulo tendrá el mismo efecto que establecerlo Desktopen , ya que los módulos creados antes de que este campo se introdujeran se escribieron implícitamente para esta edición.

En el caso de los módulos no enviados como parte de Windows (es decir, los módulos que escribe o instala desde la galería), este campo es informativo únicamente; PowerShell no cambia el comportamiento en función del CompatiblePSEditions campo, pero lo expone en el PSModuleInfo objeto (devuelto por Get-Module) para su propia lógica:

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

Nota:

El CompatiblePSEditions campo del módulo solo es compatible con PowerShell 5.1 y versiones posteriores. Incluir este campo hará que un módulo sea incompatible con PowerShell 4 y versiones posteriores. Dado que el campo es puramente informativo, se puede omitir de forma segura en versiones posteriores de PowerShell.

En PowerShell 6.1, Get-Module -ListAvailable ha actualizado su formateador para mostrar la compatibilidad de edición de cada módulo:

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

Compatibilidad con ediciones para módulos que se incluyen como parte de Windows

En el caso de los módulos que forman parte de Windows (o se instalan como parte de un rol o característica), PowerShell 6.1 y versiones posteriores tratan el CompatiblePSEditions campo de forma diferente. Estos módulos se encuentran en el directorio módulos del sistema de Windows PowerShell (%windir%\System\WindowsPowerShell\v1.0\Modules).

En el caso de los módulos cargados desde o que se encuentran en este directorio, PowerShell 6.1 y versiones posteriores usa el CompatiblePSEditions campo para determinar si el módulo será compatible con la sesión actual y se comportará en consecuencia.

Cuando Import-Module se usa, no se importará un módulo sin Core in CompatiblePSEditions y se mostrará un error:

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

Cuando Get-Module -ListAvailable se usa, los módulos sin Core in CompatiblePSEditions no se mostrarán:

Get-Module -ListAvailable BitsTransfer
# No output

En ambos casos, el -SkipEditionCheck parámetro switch se puede usar para invalidar este comportamiento:

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

Advertencia

Import-Module -SkipEditionCheck puede parecer correcto para un módulo, pero el uso de ese módulo corre el riesgo de encontrar una incompatibilidad más adelante; al cargar el módulo inicialmente correctamente, un comando puede llamar posteriormente a una API incompatible y producir un error espontáneamente.

Creación de módulos de PowerShell para la compatibilidad cruzada de edición

Al escribir un módulo de PowerShell como destino Desktop y Core ediciones de PowerShell, hay cosas que puede hacer para garantizar la compatibilidad entre ediciones.

La única manera verdadera de confirmar y validar continuamente la compatibilidad es escribir pruebas para el script o módulo y ejecutarlas en todas las versiones y ediciones de PowerShell con las que necesita compatibilidad. Un marco de pruebas recomendado para esto es Pester.

Script de PowerShell

Como lenguaje, PowerShell funciona igual entre ediciones; es los cmdlets, módulos y API de .NET que se usan que se ven afectados por la compatibilidad de edición.

Por lo general, los scripts que funcionan en PowerShell 6.1 y versiones posteriores funcionarán con Windows PowerShell 5.1, pero hay algunas excepciones.

PSScriptAnalyzer versión 1.18+ tiene reglas como PSUseCompatibleCommands y PSUseCompatibleTypes que pueden detectar posiblemente un uso incompatible de comandos y API de .NET en scripts de PowerShell.

Ensamblados .NET

Si va a escribir un módulo binario o un módulo que incorpora ensamblados de .NET (DLL) generados a partir del código fuente, debe compilar en .NET Standard y PowerShell Standard para la validación de compatibilidad en tiempo de compilación de compatibilidad con la compatibilidad de .NET y la API de PowerShell.

Aunque estas bibliotecas pueden comprobar cierta compatibilidad en tiempo de compilación, no podrán detectar posibles diferencias de comportamiento entre las ediciones. Para ello, debe seguir escribiendo pruebas.

Consulte también