Använda experimentella funktioner i PowerShell

Stöd för experimentella funktioner i PowerShell ger en mekanism för experimentella funktioner som kan samexistera med befintliga stabila funktioner i PowerShell- eller PowerShell-moduler.

En experimentell funktion är en funktion där designen inte har slutförts. Funktionen är tillgänglig för användare att testa och ge feedback. När en experimentell funktion har slutförts blir designändringarna icke-bakåtkompatibla.

Varning

Experimentella funktioner är inte avsedda att användas i produktion eftersom ändringarna tillåts brytas. Experimentella funktioner stöds inte officiellt. Vi uppskattar dock all feedback och buggrapporter. Du kan skapa filproblem på GitHub-källlagringsplatsen.

Mer information om hur du aktiverar eller inaktiverar dessa funktioner finns i about_Experimental_Features.

Livscykel för experimentell funktion

Cmdleten Get-ExperimentalFeature returnerar alla experimentella funktioner som är tillgängliga för PowerShell. Experimentella funktioner kan komma från moduler eller PowerShell-motorn. Modulbaserade experimentella funktioner är endast tillgängliga när du har importerat modulen. I följande exempel läses inte PSDesiredStateConfiguration in, så funktionen PSDesiredStateConfiguration.InvokeDscResource är inte tillgänglig.

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…
PSSubsystemPluginModel              True PSEngine A plugin model for registering and un-registering…

Använd cmdletarna Enable-ExperimentalFeature och Disable-ExperimentalFeature för att aktivera eller inaktivera en funktion. Du måste starta en ny PowerShell-session för att den här ändringen ska gälla. Kör följande kommando för att aktivera PSCommandNotFoundSuggestion funktionen:

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

När en experimentell funktion blir mainstream är den inte längre tillgänglig som en experimentell funktion eftersom funktionen nu är en del av PowerShell-motorn eller -modulen. Funktionen blev till exempel PSAnsiRenderingFileInfo mainstream i PowerShell 7.3. Du får funktionens funktioner automatiskt.

Kommentar

Vissa funktioner har konfigurationskrav, till exempel inställningsvariabler, som måste anges för att få önskat resultat från funktionen.

När en experimentell funktion upphör är den funktionen inte längre tillgänglig i PowerShell. Funktionen avbröts till exempel PSNativePSPathResolution i PowerShell 7.3.

Tillgängliga funktioner

Den här artikeln beskriver de experimentella funktioner som är tillgängliga och hur du använder funktionen.

Förklaring

  • Ikonen Experimentell anger att den experimentella funktionen är tillgänglig i versionen av PowerShell
  • Ikonen Mainstream anger vilken version av PowerShell där den experimentella funktionen blev mainstream
  • Ikonen Utgången anger den version av PowerShell där den experimentella funktionen togs bort
Name 7.2 7.3 7,4 7.5 (förhandsversion)
PSCommandNotFoundSuggestion Experimentell Experimentell Experimentell Experimentell
PSDesiredStateConfiguration.InvokeDscResource Experimentell Experimentell Experimentell Experimentell
PSNativePSPathResolution Experimentell Utgången
PSSubsystemPluginModel Experimentell Experimentell Experimentell Experimentell
PSNativeCommandArgumentPassing Experimentell Mainstream
PSAnsiRenderingFileInfo Experimentell Mainstream
PSLoadAssemblyFromNativeCode Experimentell Experimentell Experimentell Experimentell
PSNativeCommandErrorActionPreference Experimentell Mainstream
PSFeedbackProvider Experimentell Experimentell
PSModuleAutoLoadSkipOfflineFiles Experimentell Experimentell
PSCommandWithArgs Experimentell Experimentell
PSNativeWindowsTildeExpansion Experimentell

PSAnsiRenderingFileInfo

Kommentar

Den här funktionen blev mainstream i PowerShell 7.3.

ANSI-formateringsfunktionerna har lagts till i PowerShell 7.2. Den här funktionen lägger till $PSStyle.FileInfo medlemmen och aktiverar färgning av specifika filtyper.

  • $PSStyle.FileInfo.Directory – Inbyggd medlem för att ange färg för kataloger
  • $PSStyle.FileInfo.SymbolicLink – Inbyggd medlem för att ange färg för symboliska länkar
  • $PSStyle.FileInfo.Executable – Inbyggd medlem för att ange färgen för körbara filer.
  • $PSStyle.FileInfo.Extension – Använd den här medlemmen för att definiera färgerna för olika filnamnstillägg. Tilläggsmedlemmen innehåller tillägg för arkiv- och PowerShell-filer.

Mer information finns i about_Automatic_Variables.

PSCommandNotFoundSuggestion

Rekommenderar potentiella kommandon baserat på fuzzy matchande sökning efter en 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

Den här funktionen aktiverar parametern -CommandWithArgs för pwsh. Med den här parametern kan du köra ett PowerShell-kommando med argument. Till skillnad från -Commandfyller den här parametern i den $args inbyggda variabeln som kan användas av kommandot.

Den första strängen är kommandot och efterföljande strängar avgränsade med blanksteg är argumenten.

Till exempel:

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

Det här exemplet genererar följande utdata:

arg: arg1
arg: arg2

Den här funktionen lades till i PowerShell 7.4-preview.2.

PSDesiredStateConfiguration.InvokeDscResource

Möjliggör kompilering till MOF på icke-Windows-system och möjliggör användning av Invoke-DSCResource utan en LCM.

Från och med PowerShell 7.2 togs modulen PSDesiredStateConfiguration bort och den här funktionen är inaktiverad som standard. Om du vill aktivera den här funktionen måste du installera modulen PSDesiredStateConfiguration v2.0.5 från PowerShell-galleriet och aktivera funktionen.

DSC v3 har inte den här experimentella funktionen. DSC v3 stöder Invoke-DSCResource endast och använder inte eller stöder inte MOF-kompilering. Mer information finns i PowerShell Desired State Configuration v3.

PSFeedbackProvider

När du aktiverar den här funktionen använder PowerShell en ny feedbackleverantör för att ge dig feedback när ett kommando inte kan hittas. Feedbackprovidern är utökningsbar och kan implementeras av moduler från tredje part. Feedbackprovidern kan användas av andra undersystem, till exempel prediktorundersystemet, för att ge förutsägande IntelliSense-resultat.

Den här funktionen innehåller två inbyggda feedbackleverantörer:

  • GeneralCommandErrorFeedback har samma förslagsfunktioner som finns idag

  • UnixCommandNotFound, som finns i Linux, ger feedback som liknar bash.

    UnixCommandNotFound fungerar både som feedbackprovider och prediktor. Förslaget från kommandot command-not-found används både för att ge feedback när kommandot inte kan hittas i en interaktiv körning och för att tillhandahålla förutsägande IntelliSense-resultat för nästa kommandorad.

Den här funktionen lades till i PowerShell 7.4-preview.3.

PSLoadAssemblyFromNativeCode

Exponerar ett API för att tillåta sammansättningsinläsning från inbyggd kod.

PSModuleAutoLoadSkipOfflineFiles

Med den här funktionen aktiverad, om en användares PSModulePath innehåller en mapp från en molnleverantör, till exempel OneDrive, utlöser PowerShell inte längre nedladdningen av alla filer som finns i mappen. Alla filer som har markerats som inte nedladdade hoppas över. Användare som använder molnleverantörer för att synkronisera sina moduler mellan datorer bör markera modulmappen som Fäst eller motsvarande status för andra leverantörer än OneDrive. Genom att markera modulmappen som Fäst ser du till att filerna alltid sparas på disken.

Den här funktionen lades till i PowerShell 7.4-preview.1.

PSNativeCommandArgumentPassing

Kommentar

Den här funktionen blev mainstream i PowerShell 7.3.

När den här experimentella funktionen är aktiverad använder ArgumentList PowerShell -egenskapen StartProcessInfo för objektet i stället för vår nuvarande mekanism för att rekonstruera en sträng när du anropar en intern körbar fil.

Varning

Det nya beteendet är en icke-bakåtkompatibel ändring från det aktuella beteendet. Detta kan bryta skript och automatisering som kringgår de olika problemen när inbyggda program anropas. Tidigare måste citattecken vara undantagna och det går inte att ange tomma argument till ett internt program. Använd stop-parsing-token (--%) eller cmdleten Start-Process för att kringgå interna argument som skickas vid behov.

Den här funktionen lägger till en ny $PSNativeCommandArgumentPassing inställningsvariabel som styr det här beteendet. Med den här variabeln kan du välja beteende vid körning. Giltiga värden är Legacy, Standardoch Windows. Standardbeteendet är plattformsspecifikt. På Windows-plattformar är Windows standardinställningen och icke-Windows-plattformar standardvärdet Standard.

Legacy är det historiska beteendet. Beteendet Windows för och Standard läget är detsamma förutom att Windows anrop av följande filer i läge automatiskt använder formatargumentet Legacy som skickas.

  • cmd.exe
  • find.exe
  • cscript.exe
  • wscript.exe
  • sqlcmd.exe – Har lagts till i PowerShell 7.3.1
  • slutar med .bat
  • slutar med .cmd
  • slutar med .js
  • slutar med .vbs
  • slutar med .wsf

$PSNativeCommandArgumentPassing Om är inställt på antingen Legacy eller Standard, söker parsern inte efter dessa filer.

Standardbeteendet är plattformsspecifikt. På Windows-plattformar är Windows standardinställningen och icke-Windows-plattformar är Standard.

Kommentar

I följande exempel används TestExe.exe verktyget. Du kan skapa TestExe från källkoden. Se TestExe på PowerShell-källlagringsplatsen.

Nya beteenden som görs tillgängliga genom den här ändringen:

  • Literala eller expanderbara strängar med inbäddade citattecken bevaras:

    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>
    
  • Tomma strängar som argument bevaras:

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

Fler exempel på det nya beteendet finns i about_Parsing.

PowerShell 7.3 har också lagt till möjligheten att spåra parameterbindning för interna kommandon. Mer information finns i Trace-Command.

PSNativeCommandErrorActionPreference

Kommentar

Den här funktionen blev mainstream i PowerShell 7.4.

Interna kommandon returnerar vanligtvis en slutkod till det anropande programmet som är noll för lyckat eller icke-noll för fel. Interna kommandon deltar dock för närvarande inte i PowerShell-felströmmen. Omdirigerade stderr-utdata tolkas inte på samma sätt som PowerShell-felströmmen. Många interna kommandon använder stderr som en informationsström eller utförlig ström, och därför är det bara slutkoden som är viktig. Användare som arbetar med interna kommandon i sina skript måste kontrollera avslutsstatusen efter varje anrop med följande exempel:

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

Det här exemplet stöder dock inte alla fall där $? kan vara false från en cmdlet eller ett funktionsfel, vilket gör $LASTEXITCODE inaktuellt.

Den här funktionen implementerar inställningsvariabeln $PSNativeCommandUseErrorActionPreference som styr hur interna kommandofel hanteras i PowerShell. Detta gör att interna kommandofel kan generera felobjekt som läggs till i PowerShell-felströmmen och kan avsluta körningen av skriptet utan extra hantering.

$PSNativeCommandUseErrorActionPreference är inställt $false på som standard. Med inställningen inställd på $true får du följande beteende:

  • När $ErrorActionPreference = 'Stop'bryts skripten när ett internt kommando returnerar en slutkod som inte är noll.
  • När $ErrorActionPreference = 'Continue' (standardinställningen) visas PowerShell-felmeddelanden för interna kommandofel, men skripten bryts inte.

PSNativePSPathResolution

Kommentar

Den här experimentella funktionen har tagits bort i PowerShell 7.3 och stöds inte längre.

Om en PSDrive-sökväg som använder FileSystem-providern skickas till ett internt kommando skickas den lösta filsökvägen till det interna kommandot. Det innebär att ett kommando som code temp:/test.txt nu fungerar som förväntat.

I Windows, om sökvägen börjar med ~, matchas den till den fullständiga sökvägen och skickas till det interna kommandot. I båda fallen normaliseras sökvägen till katalogavgränsarna för det relevanta operativsystemet.

  • Om sökvägen inte är en PSDrive eller ~ (i Windows) sker inte sökvägsnormalisering
  • Om sökvägen finns inom enkla citattecken löses den inte och behandlas som literal

PSSubsystemPluginModel

Den här funktionen aktiverar plugin-modellen för undersystemet i PowerShell. Funktionen gör det möjligt att separera komponenter i System.Management.Automation.dll enskilda undersystem som finns i deras egen sammansättning. Den här separationen minskar diskfotavtrycket för powershell-kärnmotorn och gör att dessa komponenter kan bli valfria funktioner för en minimal PowerShell-installation.

För närvarande stöds endast CommandPredictor-undersystemet . Det här undersystemet används tillsammans med PSReadLine-modulen för att tillhandahålla anpassade förutsägelse-plugin-program. I framtiden kan Jobb, CommandCompleter, Fjärrkommunikation och andra komponenter separeras i undersystemsammansättningar utanför System.Management.Automation.dll.

Den experimentella funktionen innehåller en ny cmdlet, Get-PSSubsystem. Den här cmdleten är endast tillgänglig när funktionen är aktiverad. Den här cmdleten returnerar information om de undersystem som är tillgängliga i systemet.

PSNativeWindowsTildeExpansion

När den här funktionen är aktiverad expanderar PowerShell oquoted tilde (~) till användarens aktuella hemmapp innan inbyggda kommandon anropas. I följande exempel visas hur funktionen fungerar.

Med funktionen inaktiverad skickas tilde till det interna kommandot som en literalsträng.

PS> cmd.exe /c echo ~
~

Med funktionen aktiverad expanderar PowerShell tilde innan den skickas till det interna kommandot.

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

Den här funktionen gäller endast för Windows. På icke-Windows-plattformar hanteras tilde-expansion internt.

Den här funktionen lades till i PowerShell 7.5-preview.2.