Udostępnij za pośrednictwem


Korzystanie z funkcji eksperymentalnych w programie PowerShell

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

Uwaga

Funkcje eksperymentalne nie są przeznaczone do użycia w środowisku produkcyjnym, ponieważ zmiany mogą być przerywane. Funkcje eksperymentalne nie są oficjalnie obsługiwane. Doceniamy jednak wszelkie opinie i raporty o błędach. Problemy można zgłosić w repozytorium źródłowym usługi GitHub.

Aby uzyskać więcej informacji na temat włączania lub wyłączania tych funkcji, zobacz about_Experimental_Features.

Cykl życia funkcji eksperymentalnych

Polecenie cmdlet Get-ExperimentalFeature zwraca wszystkie funkcje eksperymentalne dostępne dla programu PowerShell. Funkcje eksperymentalne mogą pochodzić z modułów lub aparatu programu PowerShell. Funkcje eksperymentalne oparte na module są dostępne tylko po zaimportowaniu modułu. W poniższym przykładzie element PSDesiredStateConfiguration nie jest załadowany, więc PSDesiredStateConfiguration.InvokeDscResource funkcja nie jest dostępna.

Get-ExperimentalFeature
Name                             Enabled Source   Description
----                             ------- ------   -----------
PSCommandNotFoundSuggestion        False PSEngine Recommend potential commands based on fuzzy searc…
PSCommandWithArgs                  False PSEngine Enable `-CommandWithArgs` parameter for pwsh
PSFeedbackProvider                  True PSEngine Replace the hard-coded suggestion framework with …
PSLoadAssemblyFromNativeCode       False PSEngine Expose an API to allow assembly loading from nati…
PSModuleAutoLoadSkipOfflineFiles    True PSEngine Module discovery will skip over files that are ma…
PSSerializeJSONLongEnumAsNumber     True PSEngine Serialize enums based on long or ulong as an nume…
PSSubsystemPluginModel              True PSEngine A plugin model for registering and un-registering…

Użyj poleceń cmdlet Enable-ExperimentalFeature i Disable-ExperimentalFeature, aby włączyć lub wyłączyć funkcję. Aby ta zmiana obowiązywała, należy uruchomić nową sesję programu PowerShell. Uruchom następujące polecenie, aby włączyć PSCommandNotFoundSuggestion tę funkcję:

Enable-ExperimentalFeature PSCommandNotFoundSuggestion
WARNING: Enabling and disabling experimental features do not take effect until next start
of PowerShell.

Gdy funkcja eksperymentalna stanie się głównym nurtem, nie jest już dostępna jako funkcja eksperymentalna, ponieważ funkcja jest teraz częścią aparatu lub modułu programu PowerShell. Na przykład funkcja stała się głównym nurtem PSAnsiRenderingFileInfo w programie PowerShell 7.3. Funkcje funkcji są automatycznie dostępne.

Uwaga

Niektóre funkcje mają wymagania dotyczące konfiguracji, takie jak zmienne preferencji, które należy ustawić, aby uzyskać żądane wyniki z funkcji.

Gdy funkcja eksperymentalna nie zostanie zakończona, ta funkcja nie jest już dostępna w programie PowerShell. Na przykład PSNativePSPathResolution funkcja została przerwana w programie PowerShell 7.3.

Dostępne funkcje

W tym artykule opisano dostępne funkcje eksperymentalne i sposób korzystania z tej funkcji.

Legenda

  • Ikona Eksperymentalne wskazuje, że funkcja eksperymentalna jest dostępna w wersji programu PowerShell
  • Ikona Podstawowa pomoc techniczna wskazuje wersję programu PowerShell, w której funkcja eksperymentalna stała się głównym nurtem
  • Ikona Wycofano wskazuje wersję programu PowerShell, w której usunięto funkcję eksperymentalną
Nazwisko 7.2 7,4 7.5 (wersja zapoznawcza)
PSCommandNotFoundSuggestion Eksperymentalne Eksperymentalne Podstawowa pomoc techniczna
PSDesiredStateConfiguration.InvokeDscResource Eksperymentalne Eksperymentalne Eksperymentalne
PSNativePSPathResolution Eksperymentalne
PSSubsystemPluginModel Eksperymentalne Eksperymentalne Eksperymentalne
PSNativeCommandArgumentPassing Eksperymentalne
PSAnsiRenderingFileInfo Eksperymentalne
PSLoadAssemblyFromNativeCode Eksperymentalne Eksperymentalne Eksperymentalne
PSNativeCommandErrorActionPreference Podstawowa pomoc techniczna
PSFeedbackProvider Eksperymentalne Eksperymentalne
PSModuleAutoLoadSkipOfflineFiles Eksperymentalne Podstawowa pomoc techniczna
PSCommandWithArgs Eksperymentalne Podstawowa pomoc techniczna
PSNativeWindowsTildeExpansion Eksperymentalne
PSRedirectToVariable Eksperymentalne
PSSerializeJSONLongEnumAsNumber Eksperymentalne

PSAnsiRenderingFileInfo

Uwaga

Ta funkcja stała się głównym nurtem programu PowerShell 7.3.

Funkcje formatowania ANSI zostały dodane w programie PowerShell 7.2. Ta funkcja dodaje element członkowski $PSStyle.FileInfo i umożliwia kolorowanie określonych typów plików.

  • $PSStyle.FileInfo.Directory - Wbudowany element członkowski określający kolor katalogów
  • $PSStyle.FileInfo.SymbolicLink - Wbudowany element członkowski określający kolor łączy symbolicznych
  • $PSStyle.FileInfo.Executable - Wbudowany element członkowski określający kolor plików wykonywalnych.
  • $PSStyle.FileInfo.Extension — Użyj tego elementu członkowskiego, aby zdefiniować kolory dla różnych rozszerzeń plików. Element członkowski rozszerzenia zawiera wstępnie rozszerzenia dla plików archiwum i programu PowerShell.

Aby uzyskać więcej informacji, zobacz about_Automatic_Variables.

PSCommandNotFoundSuggestion

Uwaga

Ta funkcja stała się głównym nurtem w programie PowerShell 7.5-preview.5.

Zaleca potencjalne polecenia na podstawie rozmytego wyszukiwania zgodnego po commandNotFoundException.

PS> get
get: The term 'get' isn't recognized as the name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.

Suggestion [4,General]: The most similar commands are: set, del, ft, gal, gbp, gc, gci,
gcm, gdr, gcs.

PSCommandWithArgs

Uwaga

Ta funkcja stała się głównym nurtem w programie PowerShell 7.5-preview.5.

Ta funkcja umożliwia -CommandWithArgs parametr dla elementu pwsh. Ten parametr umożliwia wykonanie polecenia programu PowerShell z argumentami. W przeciwieństwie do -Commandparametru , ten parametr wypełnia wbudowaną $args zmienną, która może być używana przez polecenie .

Pierwszy ciąg to polecenie, a kolejne ciągi rozdzielane białym znakiem są argumentami.

Na przykład:

pwsh -CommandWithArgs '$args | % { "arg: $_" }' arg1 arg2

Ten przykład generuje następujące wyniki:

arg: arg1
arg: arg2

Ta funkcja została dodana w programie PowerShell 7.4-preview.2.

PSDesiredStateConfiguration.InvokeDscResource

Umożliwia kompilację moF w systemach innych niż Windows i umożliwia korzystanie Invoke-DSCResource z niego bez menedżera LCM.

Począwszy od programu PowerShell 7.2, moduł PSDesiredStateConfiguration został usunięty i ta funkcja jest domyślnie wyłączona. Aby włączyć tę funkcję, należy zainstalować moduł PSDesiredStateConfiguration v2.0.5 z Galeria programu PowerShell i włączyć tę funkcję.

Rozszerzenie DSC w wersji 3 nie ma tej funkcji eksperymentalnej. Rozszerzenie DSC w wersji 3 obsługuje Invoke-DSCResource tylko kompilację MOF ani nie używa jej ani nie obsługuje. Aby uzyskać więcej informacji, zobacz PowerShell Desired State Configuration v3.

PSFeedbackProvider

Po włączeniu tej funkcji program PowerShell używa nowego dostawcy opinii, aby przekazać opinię, gdy nie można odnaleźć polecenia. Dostawca opinii jest rozszerzalny i może być implementowany przez moduły innych firm. Dostawca opinii może być używany przez inne podsystemy, takie jak podsystem predykcyjny, w celu zapewnienia predykcyjnych wyników funkcji IntelliSense.

Ta funkcja obejmuje dwóch wbudowanych dostawców opinii:

  • Funkcja GeneralCommandErrorFeedback obsługuje te same funkcje sugestii, które już dzisiaj istnieją

  • Polecenie UnixCommandNotFound, dostępne w systemie Linux, zawiera opinie podobne do powłoki bash.

    UnixCommandNotFound służy zarówno jako dostawca opinii, jak i prognostyk. Sugestia polecenia nie znaleziono polecenia służy zarówno do przekazywania opinii, gdy nie można odnaleźć polecenia w interaktywnym uruchomieniu, oraz do udostępniania predykcyjnych wyników funkcji IntelliSense dla następnego wiersza polecenia.

Ta funkcja została dodana w programie PowerShell 7.4-preview.3.

PSLoadAssemblyFromNativeCode

Uwidacznia interfejs API, aby umożliwić ładowanie zestawu z kodu natywnego.

PSModuleAutoLoadSkipOfflineFiles

Uwaga

Ta funkcja stała się głównym nurtem w programie PowerShell 7.5-preview.5.

Po włączeniu tej funkcji, jeśli użytkownik PSModulePath zawiera folder od dostawcy chmury, takiego jak OneDrive, program PowerShell nie wyzwala już pobierania wszystkich plików zawartych w tym folderze. Pominięto wszystkie pliki oznaczone jako nie pobrane. Użytkownicy, którzy używają dostawców usług w chmurze do synchronizowania swoich modułów między maszynami, powinni oznaczyć folder modułu jako Przypięty lub równoważny stan dostawców innych niż OneDrive. Oznaczanie folderu modułu jako Przypięte gwarantuje, że pliki są zawsze przechowywane na dysku.

Ta funkcja została dodana w programie PowerShell 7.4-preview.1.

PSNativeCommandArgumentPassing

Uwaga

Ta funkcja stała się głównym nurtem programu PowerShell 7.3.

Gdy ta funkcja eksperymentalna jest włączona, program PowerShell używa ArgumentList właściwości StartProcessInfo obiektu, a nie naszego bieżącego mechanizmu rekonstrukcji ciągu podczas wywoływania natywnego pliku wykonywalnego.

Uwaga

Nowe zachowanie to zmiana powodująca niezgodność z bieżącym zachowaniem. Może to spowodować przerwanie skryptów i automatyzacji, które działają wokół różnych problemów podczas wywoływania aplikacji natywnych. Historycznie cudzysłowy muszą zostać uniknięte i nie można podać pustych argumentów aplikacji natywnej. Użyj tokenu stop-parsing (--%) lub Start-Process polecenia cmdlet, aby w razie potrzeby przejść obok natywnego argumentu.

Ta funkcja dodaje nową $PSNativeCommandArgumentPassing zmienną preferencji, która kontroluje to zachowanie. Ta zmienna umożliwia wybranie zachowania w czasie wykonywania. Prawidłowe wartości to Legacy, Standardi Windows. Domyślne zachowanie jest specyficzne dla platformy. Na platformach Windows ustawienie domyślne to Windows i platformy inne niż Windows mają wartość domyślną .Standard

Legacy jest zachowaniem historycznym. Zachowanie Windows trybu i Standard jest takie samo, z wyjątkiem, w Windows trybie, wywołania następujących plików automatycznie używają przekazywania argumentu Legacy stylu.

  • cmd.exe
  • find.exe
  • cscript.exe
  • wscript.exe
  • sqlcmd.exe — Dodano w programie PowerShell 7.3.1
  • kończące się na .bat
  • kończące się na .cmd
  • kończące się na .js
  • kończące się na .vbs
  • kończące się na .wsf

$PSNativeCommandArgumentPassing Jeśli parametr jest ustawiony na Legacy wartość lub Standard, analizator nie sprawdza tych plików.

Domyślne zachowanie jest specyficzne dla platformy. Na platformach Windows ustawieniem domyślnym jest Windows , a platformy inne niż Windows to Standard.

Uwaga

W poniższych przykładach użyto TestExe.exe narzędzia . Możesz utworzyć TestExe z poziomu kodu źródłowego. Zobacz TestExe w repozytorium źródłowym programu PowerShell.

Nowe zachowania udostępniane przez tę zmianę:

  • Ciągi literału lub ciągi rozszerzalne z osadzonymi cudzysłowami są zachowywane:

    PS> $a = 'a" "b'
    PS> TestExe -echoargs $a 'c" "d' e" "f
    Arg 0 is <a" "b>
    Arg 1 is <c" "d>
    Arg 2 is <e f>
    
  • Puste ciągi jako argumenty są zachowywane:

    PS> TestExe -echoargs '' a b ''
    Arg 0 is <>
    Arg 1 is <a>
    Arg 2 is <b>
    Arg 3 is <>
    

Aby uzyskać więcej przykładów nowego zachowania, zobacz about_Parsing.

Program PowerShell 7.3 dodał również możliwość śledzenia powiązania parametrów dla poleceń natywnych. Aby uzyskać więcej informacji, zobacz Trace-Command.

PSNativeCommandErrorActionPreference

Uwaga

Ta funkcja stała się głównym nurtem w programie PowerShell 7.4.

Natywne polecenia zwykle zwracają kod zakończenia do aplikacji wywołującej, która jest zerowa dla powodzenia lub niezerowej w przypadku niepowodzenia. Jednak polecenia natywne obecnie nie uczestniczą w strumieniu błędów programu PowerShell. Przekierowane dane wyjściowe stderr nie są interpretowane tak samo jak strumień błędów programu PowerShell. Wiele natywnych poleceń używa narzędzia stderr jako informacji lub pełnego strumienia, dlatego tylko kod zakończenia ma znaczenie. Użytkownicy pracujący z poleceniami natywnymi w swoich skryptach muszą sprawdzić stan zakończenia po każdym wywołaniu przy użyciu podobnego do poniższego przykładu:

if ($LASTEXITCODE -ne 0) {
    throw "Command failed. See above errors for details"
}

Jednak w tym przykładzie nie są obsługiwane wszystkie przypadki, w których $? może być fałsz z polecenia cmdlet lub błędu funkcji, co powoduje nieaktualne $LASTEXITCODE .

Ta funkcja implementuje zmienną $PSNativeCommandUseErrorActionPreference preferencji, która kontroluje sposób obsługi błędów natywnych poleceń w programie PowerShell. Dzięki temu natywne błędy poleceń mogą generować obiekty błędów dodawane do strumienia błędów programu PowerShell i mogą zakończyć wykonywanie skryptu bez dodatkowej obsługi.

$PSNativeCommandUseErrorActionPreference jest domyślnie ustawiona na $false wartość . Po ustawieniu $true preferencji uzyskasz następujące zachowanie:

  • Gdy $ErrorActionPreference = 'Stop'skrypty zostaną przerwane, gdy polecenie natywne zwraca kod zakończenia inny niż zero.
  • Gdy $ErrorActionPreference = 'Continue' (ustawienie domyślne), zobaczysz komunikaty o błędach programu PowerShell dla natywnych błędów poleceń, ale skrypty nie zostaną przerwane.

PSNativePSPathResolution

Uwaga

Ta funkcja eksperymentalna została usunięta w programie PowerShell 7.3 i nie jest już obsługiwana.

Jeśli ścieżka psDrive używająca dostawcy systemu plików jest przekazywana do natywnego polecenia, rozpoznana ścieżka pliku jest przekazywana do natywnego polecenia. Oznacza to, że polecenie, takie jak code temp:/test.txt teraz, działa zgodnie z oczekiwaniami.

Ponadto w systemie Windows, jeśli ścieżka rozpoczyna się od ~, jest rozpoznawana jako pełna ścieżka i przekazana do natywnego polecenia. W obu przypadkach ścieżka jest znormalizowana do separatorów katalogów dla odpowiedniego systemu operacyjnego.

  • Jeśli ścieżka nie jest usługą PSDrive lub ~ (w systemie Windows), normalizacja ścieżki nie występuje
  • Jeśli ścieżka znajduje się w pojedynczych cudzysłowach, nie jest rozpoznawana i traktowana jako literał

PSRedirectToVariable

Uwaga

Ta funkcja eksperymentalna została dodana w programie PowerShell 7.5-preview.4.

Po włączeniu tej funkcji ta funkcja dodaje obsługę przekierowywania do dysku zmiennych. Ta funkcja umożliwia przekierowywanie danych do zmiennej variable:name przy użyciu składni. Program PowerShell sprawdza obiekt docelowy przekierowania i jeśli używa dostawcy zmiennych, który wywołuje Set-Variable , a nie Out-File.

W poniższym przykładzie pokazano, jak przekierować dane wyjściowe polecenia do zmiennej:

. {
    "Output 1"
    Write-Warning "Warning, Warning!"
    "Output 2"
} 3> variable:warnings
$warnings
Output 1
Output 2
WARNING: Warning, Warning!

PSSubsystemPluginModel

Ta funkcja umożliwia model wtyczki podsystemu w programie PowerShell. Funkcja umożliwia oddzielenie składników od System.Management.Automation.dll poszczególnych podsystemów, które znajdują się we własnym zestawie. Ta separacja zmniejsza zużycie dysku podstawowego aparatu programu PowerShell i pozwala tym składnikom stać się opcjonalnymi funkcjami w przypadku minimalnej instalacji programu PowerShell.

Obecnie obsługiwany jest tylko podsystem CommandPredictor . Ten podsystem jest używany wraz z modułem PSReadLine w celu zapewnienia niestandardowych wtyczek przewidywania. W przyszłości zadanie, polecenieCompleter, komunikacja zdalna i inne składniki mogą być rozdzielone na zestawy podsystemu System.Management.Automation.dllpoza programem .

Funkcja eksperymentalna zawiera nowe polecenie cmdlet Get-PSSubsystem. To polecenie cmdlet jest dostępne tylko wtedy, gdy funkcja jest włączona. To polecenie cmdlet zwraca informacje o podsystemach, które są dostępne w systemie.

PSNativeWindowsTildeExpansion

Po włączeniu tej funkcji program PowerShell rozszerza niekwotowaną tyldę (~) do bieżącego folderu macierzystego użytkownika przed wywołaniem poleceń natywnych. W poniższych przykładach pokazano, jak działa funkcja.

Po wyłączeniu funkcji tilde jest przekazywana do natywnego polecenia jako ciągu literału.

PS> cmd.exe /c echo ~
~

Po włączeniu tej funkcji program PowerShell rozszerza tyldę przed przekazaniem jej do natywnego polecenia.

PS> cmd.exe /c echo ~
C:\Users\username

Ta funkcja dotyczy tylko systemu Windows. Na platformach innych niż Windows rozszerzenie tyldy jest obsługiwane natywnie.

Ta funkcja została dodana w programie PowerShell 7.5-preview.2.

PSSerializeJSONLongEnumAsNumber

Ta funkcja umożliwia polecenie cmdlet ConvertTo-Json serializację wszystkich wartości wyliczenia na Int64/long podstawie wartości liczbowych lub UInt64/ulong jako wartości liczbowej, a nie ciąg reprezentujący tę wartość wyliczeniową. Dzięki temu zachowanie serializacji wyliczeniowej jest zgodne z innymi typami podstawowymi, w których polecenie cmdlet serializuje wyliczenia jako wartość liczbową. Użyj parametru EnumsAsStrings , aby serializować jako reprezentację ciągu.

Na przykład:

# PSSerializeJSONLongEnumAsNumber disabled
@{
    Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json
# { "Key": "Cmdlets" }

# PSSerializeJSONLongEnumAsNumber enabled
@{
    Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json
# { "Key": 32 }

# -EnumsAsStrings to revert back to the old behaviour
@{
    Key = [System.Management.Automation.Tracing.PowerShellTraceKeywords]::Cmdlets
} | ConvertTo-Json -EnumsAsStrings
# { "Key": "Cmdlets" }