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 wskazuje, że funkcja eksperymentalna jest dostępna w wersji programu PowerShell
- Ikona wskazuje wersję programu PowerShell, w której funkcja eksperymentalna stała się głównym nurtem
- Ikona wskazuje wersję programu PowerShell, w której usunięto funkcję eksperymentalną
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 -Command
parametru , 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
, Standard
i 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.dll
poza 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" }