Condividi tramite


informazioni_Funzionalità_Sperimentali

Il supporto delle funzionalità sperimentali in PowerShell fornisce un meccanismo per le funzionalità sperimentali per coesistere con le funzionalità stabili esistenti nei moduli di PowerShell o PowerShell.

Una funzionalità sperimentale è quella in cui la progettazione non viene finalizzata. La funzionalità è disponibile per gli utenti per testare e fornire commenti e suggerimenti. Una volta completata la finalizzazione di una funzionalità sperimentale, le modifiche di progettazione diventano di rilievo. Le funzionalità sperimentali non devono essere usate nell'ambiente di produzione perché le modifiche possono essere interrotte.

Le funzionalità sperimentali sono disabilitate per impostazione predefinita e devono essere abilitate in modo esplicito dall'utente o dall'amministratore del sistema.

Le funzionalità sperimentali abilitate sono elencate nel file powershell.config.json in $PSHOME per tutti gli utenti o il file di configurazione specifico dell'utente per un utente specifico.

Nota

Le funzionalità sperimentali abilitate nel file di configurazione utente hanno la precedenza sulle funzionalità sperimentali elencate nel file di configurazione del sistema.

Attributo Sperimentale

Usare l'attributo Experimental per dichiarare codice come sperimentale.

Usare la sintassi seguente per dichiarare l'attributo Experimental specificando il nome della funzionalità sperimentale e l'azione da eseguire se la funzionalità sperimentale è abilitata:

[Experimental(NameOfExperimentalFeature, ExperimentAction)]

Per i moduli, il NameOfExperimentalFeature deve seguire il formato di <modulename>.<experimentname>. Il parametro ExperimentAction deve essere specificato e gli unici valori validi sono:

  • Show significa mostrare questa funzionalità sperimentale se la funzionalità è abilitata
  • Hide significa nascondere questa funzionalità sperimentale se la funzionalità è abilitata

Dichiarazione di funzionalità sperimentali nei moduli scritti in C#

Gli autori di moduli che vogliono usare i flag di funzionalità sperimentale possono dichiarare un cmdlet come sperimentale usando l'attributo Experimental.

[Experimental("MyWebCmdlets.PSWebCmdletV2", ExperimentAction.Show)]
[Cmdlet(Verbs.Invoke, "WebRequest")]
public class InvokeWebRequestCommandV2 : WebCmdletBaseV2 { ... }

Dichiarazione di funzionalità sperimentali nei moduli scritti in PowerShell

Il modulo scritto in PowerShell può anche usare l'attributo Experimental per dichiarare i cmdlet sperimentali:

function Enable-SSHRemoting {
    [Experimental("MyRemoting.PSSSHRemoting", "Show")]
    [CmdletBinding()]
    param()
    ...
}

I metadati relativi a una funzionalità sperimentale vengono mantenuti nel manifesto del modulo. Usare la proprietà PrivateData.PSData.ExperimentalFeatures di un manifesto del modulo per esporre le funzionalità sperimentali del modulo. La proprietà ExperimentalFeatures è una matrice di tabelle hash contenenti il nome e la descrizione della funzionalità.

Per esempio:

PrivateData = @{
  PSData = @{
    ExperimentalFeatures = @(
      @{
          Name = "PSWebCmdletV2"
          Description = "Rewrite the web cmdlets for better performance"
      },
      @{
          Name = "PSRestCmdletV2"
          Description = "Rewrite the REST API cmdlets for better performance"
      }
    )
  }
}

Funzionalità sperimentali che si escludono a vicenda

Esistono casi in cui una funzionalità sperimentale non può coesistere side-by-side con una funzionalità esistente o un'altra funzionalità sperimentale.

Ad esempio, è possibile avere un cmdlet sperimentale che esegue l'override di un cmdlet esistente. Le due versioni non possono coesistere affiancate. L'impostazione ExperimentAction.Hide consente di abilitare solo uno dei due cmdlet contemporaneamente.

In questo esempio viene creato un nuovo cmdlet sperimentale Invoke-WebRequest. InvokeWebRequestCommand contiene l'implementazione non sperimentale. InvokeWebRequestCommandV2 contiene la versione sperimentale del cmdlet.

L'uso di ExperimentAction.Hide consentirà di abilitare una sola delle due funzionalità contemporaneamente:

[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 { ... }

Quando la funzionalità sperimentale MyWebCmdlets.PSWebCmdletV2 è abilitata, l'implementazione InvokeWebRequestCommand esistente è nascosta e il InvokeWebRequestCommandV2 fornisce l'implementazione di Invoke-WebRequest.

In questo modo gli utenti possono provare il nuovo cmdlet e fornire commenti e suggerimenti e quindi ripristinare la versione non sperimentale quando necessario.

Parametri sperimentali nei cmdlet

L'attributo Experimental può essere applicato anche ai singoli parametri. In questo modo è possibile creare un set sperimentale di parametri per un cmdlet esistente anziché un cmdlet completamente nuovo.

Ecco un esempio in C#:

[Experimental("MyModule.PSNewAddTypeCompilation", ExperimentAction.Show)]
[Parameter(ParameterSet = "NewCompilation")]
public CompilationParameters CompileParameters { ... }

[Experimental("MyModule.PSNewAddTypeCompilation", ExperimentAction.Hide)]
[Parameter()]
public CodeDom CodeDom { ... }

Di seguito è riportato un esempio diverso nello script di PowerShell:

param(
    [Experimental("MyModule.PSNewFeature", "Show")]
    [string] $NewName,

    [Experimental("MyModule.PSNewFeature", "Hide")]
    [string] $OldName
)

Verifica se è abilitata una funzionalità sperimentale

Nel codice è necessario verificare se la funzionalità sperimentale è abilitata prima di intraprendere un'azione appropriata. È possibile determinare se una funzionalità sperimentale è abilitata usando il metodo IsEnabled() statico nella classe System.Management.Automation.ExperimentalFeature.

Ecco un esempio in C#:

if (ExperimentalFeature.IsEnabled("MyModule.MyExperimentalFeature"))
{
   // code specific to the experimental feature
}

Di seguito è riportato un esempio di script di PowerShell:

if ([ExperimentalFeature]::IsEnabled("MyModule.MyExperimentalFeature"))
{
  # code specific to the experimental feature
}

Vedere anche