Acerca de las ediciones de PowerShellAbout PowerShell Editions

Descripción breveShort Description

Diferentes ediciones de PowerShell se ejecutan en entornos de ejecución subyacentes diferentes.Different editions of PowerShell run on different underlying runtimes.

Descripción largaLong Description

Desde PowerShell 5,1, hay varias ediciones de PowerShell que se ejecutan cada una en un entorno de tiempo de ejecución de .net diferente.From PowerShell 5.1, there are multiple editions of PowerShell that each run on a different .NET runtime. A partir de PowerShell 6,2 hay dos ediciones de PowerShell:As of PowerShell 6.2 there are two editions of PowerShell:

  • Escritorio , que se ejecuta en .NET Framework.Desktop , which runs on .NET Framework. PowerShell 4 y versiones anteriores, así como PowerShell 5,1 en ediciones completas de Windows como escritorio de Windows, Windows Server, Windows Server Core y la mayoría de los demás sistemas operativos Windows son 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. Esta es la edición de PowerShell original.This is the original PowerShell edition.
  • Núcleo , que se ejecuta en .net Core.Core , which runs on .NET Core. PowerShell 6,0 y versiones posteriores, así como PowerShell 5,1 en algunas ediciones de Windows de menor tamaño, como Windows nano Server y Windows IoT, donde .NET Framework no está disponible.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.

Dado que la edición de PowerShell corresponde a su tiempo de ejecución de .NET, es el indicador principal de la compatibilidad del módulo de PowerShell y la API de .NET. algunas API, tipos o métodos de .NET no están disponibles en los tiempos de ejecución de .NET y esto afecta a los scripts y módulos de PowerShell que dependen de ellos.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.

La $PSEdition variable automáticaThe $PSEdition automatic variable

En PowerShell 5,1 y versiones posteriores, puede averiguar qué edición está ejecutando con la $PSEdition variable automática:In PowerShell 5.1 and above, you can find out what edition you are running with the $PSEdition automatic variable:

$PSEdition
Core

En PowerShell 4 y versiones anteriores, esta variable no existe.In PowerShell 4 and below, this variable does not exist. $PSEdition Si es null, se debe tratar como el mismo que el valor Desktop .$PSEdition being null should be treated as the same as having the value Desktop.

Edición en $PSVersionTableEdition in $PSVersionTable

La $PSVersionTable variable automática también tiene información de edición en PowerShell 5,1 y versiones posteriores: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

El PSEdition campo tendrá el mismo valor que la $PSEdition variable automática.The PSEdition field will have the same value as the $PSEdition automatic variable.

CompatiblePSEditionsCampo de manifiesto del móduloThe CompatiblePSEditions module manifest field

Los módulos de PowerShell pueden declarar Qué ediciones de PowerShell son compatibles con el uso del CompatiblePSEditions campo del manifiesto del módulo.PowerShell modules can declare what editions of PowerShell they are compatible with using the CompatiblePSEditions field of the module manifest.

Por ejemplo, un manifiesto de módulo que declara la compatibilidad con las Desktop Core ediciones y de 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')
}

Un ejemplo de un manifiesto de módulo con solo Desktop compatibilidad:An example of a module manifest with only Desktop compatibility:

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

Omitir el CompatiblePSEditions campo de un manifiesto de módulo tendrá el mismo efecto que establecerlo en Desktop , ya que los módulos creados antes de que se introdujera este campo se escribieron implícitamente para esta edición.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.

En el caso de los módulos que no se incluyen como parte de Windows (es decir, los módulos que se escriben o se instalan desde la galería), este campo es meramente informativo. PowerShell no cambia el comportamiento basado en el CompatiblePSEditions campo, pero lo expone en el PSModuleInfo objeto (devuelto por Get-Module ) para su propia lógica: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

El CompatiblePSEditions campo módulo solo es compatible con PowerShell 5,1 y versiones posteriores.The CompatiblePSEditions module field is only compatible with PowerShell 5.1 and above. Incluir este campo hará que un módulo sea incompatible con PowerShell 4 y versiones anteriores.Including this field will cause a module to be incompatible with PowerShell 4 and below. Dado que el campo es meramente informativo, puede omitirse de forma segura en versiones posteriores de PowerShell.Since the field is purely informational, it can be safely omitted in later PowerShell versions.

En PowerShell 6,1, Get-Module -ListAvailable se ha actualizado su formateador para mostrar la compatibilidad con la edición de cada módulo: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...

Edición: compatibilidad de los módulos que se incluyen como parte de WindowsEdition-compatibility for modules that ship as part of Windows

En el caso de los módulos que se incluyen como parte de Windows (o que se instalan como parte de un rol o una característica), PowerShell 6,1 y versiones posteriores tratan el CompatiblePSEditions campo de forma diferente.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. Estos módulos se encuentran en el directorio de módulos del sistema de 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).

En el caso de los módulos cargados desde o encontrados en este directorio, PowerShell 6,1 y versiones posteriores usan el CompatiblePSEditions campo para determinar si el módulo será compatible con la sesión actual y se comparará en consecuencia.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.

Cuando Import-Module se usa, un módulo sin Core en CompatiblePSEditions no se importará y se mostrará un error: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

Cuando Get-Module -ListAvailable se utiliza, Core CompatiblePSEditions no se mostrarán los módulos sin en:When Get-Module -ListAvailable is used, modules without Core in CompatiblePSEditions will not be displayed:

Get-Module -ListAvailable BitsTransfer
# No output

En ambos casos, -SkipEditionCheck se puede usar el parámetro de modificador para invalidar este comportamiento: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,...

Advertencia

Import-Module -SkipEditionCheck puede parecer que es correcto para un módulo, pero el uso de ese módulo corre el riesgo de encontrar una incompatibilidad más adelante; mientras la carga del módulo se realiza correctamente, un comando puede llamar después a una API incompatible y producir un error espontáneo.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.

Creación de módulos de PowerShell para la compatibilidad con varias edicionesAuthoring PowerShell modules for edition cross-compatibility

Al escribir un módulo de PowerShell para tener como destino las Desktop Core ediciones y de PowerShell, hay cosas que puede hacer para garantizar la compatibilidad entre ediciones.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.

Sin embargo, la única manera 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 a las que se necesita compatibilidad.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 marco de pruebas recomendado es Pester.A recommended testing framework for this is Pester.

Script de PowerShellPowerShell script

Como lenguaje, PowerShell funciona igual entre las ediciones de; es el uso de los cmdlets, los módulos y las API de .NET que se ven afectados por la compatibilidad de la edición.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.

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.Generally, scripts that work in PowerShell 6.1 and above will work with Windows PowerShell 5.1, but there are some exceptions.

El módulo version 1.18.0 PSScriptAnalyzer tiene reglas como PSUseCompatibleCommands y PSUseCompatibleTypes que pueden detectar el uso posiblemente incompatible de comandos y API de .net en scripts de 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.

Ensamblados .NET.NET assemblies

Si está escribiendo un módulo binario o un módulo que incorpora ensamblados .NET (dll) generados a partir del código fuente, debe compilar con .net Standard y el [estándar de PowerShell][] para la validación de la compatibilidad en tiempo de compilación de .net y la compatibilidad con la API de PowerShell.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.

Aunque estas bibliotecas pueden comprobar la compatibilidad en tiempo de compilación, no podrán detectar posibles diferencias de comportamiento entre las ediciones.Although these libraries are able to check some compatibility at compile time, they won't be able to catch possible behavioral differences between editions. Para ello, debe escribir pruebas.For this you must still write tests.

Consulte tambiénSee also