about_Experimental_Features
Obsługa funkcji eksperymentalnych w programie PowerShell zapewnia mechanizm eksperymentalnych funkcji współistnienia z istniejącymi stabilnymi funkcjami w modułach programu PowerShell lub programu PowerShell.
Funkcja eksperymentalna jest funkcją, w której projekt nie jest sfinalizowany. Funkcja jest dostępna dla użytkowników do testowania i przekazywania opinii. Po sfinalizowaniu funkcji eksperymentalnej zmiany projektu staną się zmianami powodujących niezgodność. Funkcje eksperymentalne nie są przeznaczone do użycia w środowisku produkcyjnym, ponieważ zmiany mogą być przerywane.
Funkcje eksperymentalne są domyślnie wyłączone i muszą być jawnie włączone przez użytkownika lub administratora systemu.
Włączone funkcje eksperymentalne są wymienione w pliku w powershell.config.json
$PSHOME
pliku dla wszystkich użytkowników lub pliku konfiguracji specyficznego dla użytkownika dla określonego użytkownika.
Uwaga
Funkcje eksperymentalne włączone w pliku konfiguracji użytkownika mają pierwszeństwo przed funkcjami eksperymentalnymi wymienionymi w pliku konfiguracji systemu.
Atrybut eksperymentalny
Użyj atrybutu , Experimental
aby zadeklarować kod jako eksperymentalny.
Użyj następującej składni, aby zadeklarować Experimental
atrybut podający nazwę funkcji eksperymentalnej i akcję do wykonania, jeśli funkcja eksperymentalna jest włączona:
[Experimental(NameOfExperimentalFeature, ExperimentAction)]
W przypadku modułów NameOfExperimentalFeature
element musi mieć postać <modulename>.<experimentname>
. Należy ExperimentAction
określić parametr, a jedynymi prawidłowymi wartościami są:
Show
oznacza, aby pokazać tę funkcję eksperymentalną, jeśli funkcja jest włączonaHide
oznacza ukrycie tej funkcji eksperymentalnej, jeśli funkcja jest włączona
Deklarowanie funkcji eksperymentalnych w modułach napisanych w języku C#
Autorzy modułów, którzy chcą używać flag funkcji eksperymentalnych, mogą zadeklarować polecenie cmdlet jako eksperymentalne przy użyciu atrybutu Experimental
.
[Experimental("MyWebCmdlets.PSWebCmdletV2", ExperimentAction.Show)]
[Cmdlet(Verbs.Invoke, "WebRequest")]
public class InvokeWebRequestCommandV2 : WebCmdletBaseV2 { ... }
Deklarowanie funkcji eksperymentalnych w modułach napisanych w programie PowerShell
Moduł napisany w programie PowerShell może również używać atrybutu Experimental
do deklarowania eksperymentalnych poleceń cmdlet:
function Enable-SSHRemoting {
[Experimental("MyRemoting.PSSSHRemoting", "Show")]
[CmdletBinding()]
param()
...
}
Metadane dotyczące funkcji eksperymentalnej są przechowywane w manifeście modułu. PrivateData.PSData.ExperimentalFeatures
Użyj właściwości manifestu modułu, aby uwidocznić funkcje eksperymentalne z modułu. Właściwość ExperimentalFeatures
to tablica tabel skrótów zawierająca nazwę i opis funkcji.
Na przykład:
PrivateData = @{
PSData = @{
ExperimentalFeatures = @(
@{
Name = "PSWebCmdletV2"
Description = "Rewrite the web cmdlets for better performance"
},
@{
Name = "PSRestCmdletV2"
Description = "Rewrite the REST API cmdlets for better performance"
}
)
}
}
Wzajemnie wykluczające się funkcje eksperymentalne
Istnieją przypadki, w których funkcja eksperymentalna nie może współistnieć obok istniejącej funkcji lub innej funkcji eksperymentalnej.
Możesz na przykład mieć eksperymentalne polecenie cmdlet, które zastępuje istniejące polecenie cmdlet. Obie wersje nie mogą współistnieć obok siebie. Ustawienie ExperimentAction.Hide
umożliwia włączenie tylko jednego z dwóch poleceń cmdlet jednocześnie.
W tym przykładzie utworzymy nowe eksperymentalne Invoke-WebRequest
polecenie cmdlet.
InvokeWebRequestCommand
zawiera implementację nie eksperymentalną.
InvokeWebRequestCommandV2
zawiera eksperymentalną wersję polecenia cmdlet.
Użycie funkcji ExperimentAction.Hide
pozwoli jednocześnie włączyć tylko jedną z dwóch funkcji:
[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 { ... }
Po włączeniu funkcji eksperymentalnej MyWebCmdlets.PSWebCmdletV2
istniejąca InvokeWebRequestCommand
implementacja jest ukryta i InvokeWebRequestCommandV2
zapewnia implementację programu Invoke-WebRequest
.
Dzięki temu użytkownicy mogą wypróbować nowe polecenie cmdlet i przekazać opinię, a następnie przywrócić nie eksperymentalną wersję w razie potrzeby.
Parametry eksperymentalne w poleceniach cmdlet
Atrybut Experimental
można również zastosować do poszczególnych parametrów. Dzięki temu można utworzyć eksperymentalny zestaw parametrów dla istniejącego polecenia cmdlet, a nie całkowicie nowego polecenia cmdlet.
Oto przykład w języku C#:
[Experimental("MyModule.PSNewAddTypeCompilation", ExperimentAction.Show)]
[Parameter(ParameterSet = "NewCompilation")]
public CompilationParameters CompileParameters { ... }
[Experimental("MyModule.PSNewAddTypeCompilation", ExperimentAction.Hide)]
[Parameter()]
public CodeDom CodeDom { ... }
Oto inny przykład skryptu programu PowerShell:
param(
[Experimental("MyModule.PSNewFeature", "Show")]
[string] $NewName,
[Experimental("MyModule.PSNewFeature", "Hide")]
[string] $OldName
)
Sprawdzanie, czy funkcja eksperymentalna jest włączona
W kodzie należy sprawdzić, czy funkcja eksperymentalna jest włączona przed podjęciem odpowiednich działań. Możesz określić, czy funkcja eksperymentalna jest włączona przy użyciu metody statycznej IsEnabled()
w System.Management.Automation.ExperimentalFeature
klasie .
Oto przykład w języku C#:
if (ExperimentalFeature.IsEnabled("MyModule.MyExperimentalFeature"))
{
// code specific to the experimental feature
}
Oto przykład skryptu programu PowerShell:
if ([ExperimentalFeature]::IsEnabled("MyModule.MyExperimentalFeature"))
{
# code specific to the experimental feature
}