about_Experimental_Features
La compatibilidad con las características experimentales de PowerShell proporciona un mecanismo para que las características experimentales coexistan con las características estables existentes en PowerShell o los módulos de PowerShell.
Una característica experimental es aquella en la el diseño no ha finalizado. La característica está disponible para que los usuarios puedan probar y proporcionar comentarios. Una vez finalizada una característica experimental, los cambios de diseño se vuelven importantes. No está previsto que las características experimentales se usen en producción, ya que los cambios se pueden interrumpir.
Las características experimentales están deshabilitadas de forma predeterminada y deben estar habilitadas explícitamente por el usuario o el administrador del sistema.
Las características experimentales habilitadas se muestran en el powershell.config.json
archivo en $PSHOME
para todos los usuarios o el archivo de configuración específico del usuario para un usuario específico.
Nota:
Las características experimentales habilitadas en el archivo de configuración de usuario tienen prioridad sobre las características experimentales enumeradas en el archivo de configuración del sistema.
Atributo experimental
Use el Experimental
atributo para declarar código como experimental.
Use la sintaxis siguiente para declarar el Experimental
atributo que proporciona el nombre de la característica experimental y la acción que se va a realizar si la característica experimental está habilitada:
[Experimental(NameOfExperimentalFeature, ExperimentAction)]
En el caso de los módulos, NameOfExperimentalFeature
debe seguir la forma de <modulename>.<experimentname>
. El ExperimentAction
parámetro debe especificarse y los únicos valores válidos son:
Show
significa mostrar esta característica experimental si la característica está habilitadaHide
significa ocultar esta característica experimental si la característica está habilitada
Declarar características experimentales en módulos escritos en C#
Los autores de módulos que quieran usar las marcas de características experimentales pueden declarar un cmdlet como experimental mediante el Experimental
atributo .
[Experimental("MyWebCmdlets.PSWebCmdletV2", ExperimentAction.Show)]
[Cmdlet(Verbs.Invoke, "WebRequest")]
public class InvokeWebRequestCommandV2 : WebCmdletBaseV2 { ... }
Declaración de características experimentales en módulos escritos en PowerShell
El módulo escrito en PowerShell también puede usar el Experimental
atributo para declarar cmdlets experimentales:
function Enable-SSHRemoting {
[Experimental("MyRemoting.PSSSHRemoting", "Show")]
[CmdletBinding()]
param()
...
}
Los metadatos sobre una característica experimental se conservan en el manifiesto del módulo. Use la PrivateData.PSData.ExperimentalFeatures
propiedad de un manifiesto de módulo para exponer las características experimentales del módulo. La ExperimentalFeatures
propiedad es una matriz de tablas hash que contienen el nombre y la descripción de la característica.
Por ejemplo:
PrivateData = @{
PSData = @{
ExperimentalFeatures = @(
@{
Name = "PSWebCmdletV2"
Description = "Rewrite the web cmdlets for better performance"
},
@{
Name = "PSRestCmdletV2"
Description = "Rewrite the REST API cmdlets for better performance"
}
)
}
}
Características experimentales mutuamente excluyentes
Hay casos en los que una característica experimental no puede coexistir en paralelo con una característica existente u otra característica experimental.
Por ejemplo, puede tener un cmdlet experimental que invalide un cmdlet existente. Las dos versiones no pueden coexistir en paralelo. La ExperimentAction.Hide
configuración solo permite habilitar uno de los dos cmdlets a la vez.
En este ejemplo, se crea un nuevo cmdlet experimental Invoke-WebRequest
.
InvokeWebRequestCommand
contiene la implementación no experimental.
InvokeWebRequestCommandV2
contiene la versión experimental del cmdlet.
El uso de ExperimentAction.Hide
permitirá habilitar solo una de las dos características a la vez:
[Experimental("MyWebCmdlets.PSWebCmdletV2", ExperimentAction.Show)]
[Cmdlet(Verbs.Invoke, "WebRequest")]
public class InvokeWebRequestCommandV2 : WebCmdletBaseV2 { ... }
[Experimental("MyWebCmdlets.PSWebCmdletV2", ExperimentAction.Hide)]
[Cmdlet(Verbs.Invoke, "WebRequest")]
public class InvokeWebRequestCommand : WebCmdletBase { ... }
Cuando la MyWebCmdlets.PSWebCmdletV2
característica experimental está habilitada, la implementación existente InvokeWebRequestCommand
está oculta y InvokeWebRequestCommandV2
proporciona la implementación de Invoke-WebRequest
.
Esto permite a los usuarios probar el nuevo cmdlet y proporcionar comentarios y, a continuación, revertir a la versión no experimental cuando sea necesario.
Parámetros experimentales en cmdlets
El Experimental
atributo también se puede aplicar a parámetros individuales. Esto le permite crear un conjunto experimental de parámetros para un cmdlet existente en lugar de un cmdlet completamente nuevo.
Este es un ejemplo en C#:
[Experimental("MyModule.PSNewAddTypeCompilation", ExperimentAction.Show)]
[Parameter(ParameterSet = "NewCompilation")]
public CompilationParameters CompileParameters { ... }
[Experimental("MyModule.PSNewAddTypeCompilation", ExperimentAction.Hide)]
[Parameter()]
public CodeDom CodeDom { ... }
Este es un ejemplo diferente en el script de PowerShell:
param(
[Experimental("MyModule.PSNewFeature", "Show")]
[string] $NewName,
[Experimental("MyModule.PSNewFeature", "Hide")]
[string] $OldName
)
Comprobación de si una característica experimental está habilitada
En el código, deberá comprobar si la característica experimental está habilitada antes de realizar las acciones adecuadas. Puede determinar si una característica experimental está habilitada mediante el método estático IsEnabled()
en la System.Management.Automation.ExperimentalFeature
clase .
Este es un ejemplo en C#:
if (ExperimentalFeature.IsEnabled("MyModule.MyExperimentalFeature"))
{
// code specific to the experimental feature
}
Este es un ejemplo en el script de PowerShell:
if ([ExperimentalFeature]::IsEnabled("MyModule.MyExperimentalFeature"))
{
# code specific to the experimental feature
}