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 slutförs. Funktionen är tillgänglig för användare att testa och ge feedback. När en experimentell funktion har slutförs blir designändringarna större ändringar.
Varning
Experimentella funktioner är inte avsedda att användas i produktion eftersom ändringarna får brytas. Experimentella funktioner stöds inte officiellt. Vi uppskattar dock all feedback och eventuella buggrapporter. Du kan skapa problem i GitHub källdatabasen.
Mer information om hur du aktiverar eller inaktiverar dessa funktioner finns i about_Experimental_Features.
Tillgängliga funktioner
I den här artikeln beskrivs de experimentella funktioner som är tillgängliga och hur du använder funktionen.
Förklaring
- ✔️ - anger att den experimentella funktionen är tillgänglig i versionen av PowerShell
- ✅ – anger den version av PowerShell där den experimentella funktionen blev vanlig
- ❌ – anger den version av PowerShell där den experimentella funktionen har tagits bort
| Name | 7.0 | 7.1 | 7.2 |
|---|---|---|---|
| PSNullConditionalOperators | ✔️ | ✅ | |
| PSUnixFileStat (endast icke-Windows) | ✔️ | ✔️ | ✅ |
| Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace | ✔️ | ✔️ | ✅ |
| PSCultureInvariantReplaceOperator | ✔️ | ✅ | |
| PSNotApplyErrorActionToStderr | ✔️ | ✅ | |
| PSImplicitRemotingBatching | ✔️ | ✔️ | ❌ |
| PSCommandNotFoundSuggestion | ✔️ | ✔️ | ✔️ |
| PSDesiredStateConfiguration.InvokedscResource | ✔️ | ✔️ | ✔️ |
| PSNativePSPathResolution | ✔️ | ✔️ | |
| PSSubsystemPluginModel | ✔️ | ✔️ | |
| PSNativeCommandArgumentPassing | ✔️ | ||
| PSAnsiRenderingFileInfo | ✔️ | ||
| PSLoadAssemblyFromNativeCode | ✔️ |
Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace
Anteckning
Den här funktionen blev vanlig i PowerShell 7.2.
I PowerShell 7.0 möjliggör experimentet breakAll-parametern på cmdletarna och så att användarna kan avgöra om de vill att PowerShell ska brytas omedelbart på den aktuella platsen när de kopplar en Debug-Runspace Debug-Job felsökare.
I PowerShell 7.1 lägger det här experimentet även till runspace-parametern i *-PSBreakpoint cmdletarna.
Disable-PSBreakpointEnable-PSBreakpointGet-PSBreakpointRemove-PSBreakpointSet-PSBreakpoint
Parametern Runspace anger ett Runspace-objekt som ska interagera med brytpunkter i det angivna körningsutrymmet.
Start-Job -ScriptBlock {
Set-PSBreakpoint -Command Start-Sleep
Start-Sleep -Seconds 10
}
$runspace = Get-Runspace -Id 1
$breakpoint = Get-PSBreakPoint -Runspace $runspace
I det här exemplet startas ett jobb och en brytpunkt anges till brytpunkt när Set-PSBreakPoint körs. Runspace lagras i en variabel och skickas till kommandot Get-PSBreakPoint med parametern Runspace. Du kan sedan granska brytpunkten i $breakpoint variabeln .
PSAnsiRenderingFileInfo
Det här experimentet lades 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ärg för körbara filer.$PSStyle.FileInfo.Extension– Använd den här medlemmen för att definiera färger för olika filnamnstillägg. Tilläggsmedlemmen innehåller i förväg tillägg för arkiv- och PowerShell-filer.
Mer information finns i about_Automatic_Variables.
Anteckning
Du måste ha den experimentella funktionen PSAnsiRendering aktiverad för att kunna använda den här funktionen.
PSCommandNotFoundSuggestion
Rekommenderar potentiella kommandon baserat på fuzzy-matchningssökning efter en CommandNotFoundException.
PS> get
get: The term 'get' is not 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.
PSCultureInvariantReplaceOperator
När den vänstra operanden i en -replace operatorsats inte är en sträng, konverteras operanden till en sträng.
När den här funktionen är inaktiverad gör -replace operatorn en kulturkänslig strängkonvertering.
Om din kultur till exempel är inställd på Franska (fr) 1.2 konverteras värdet till strängen 1,2 .
PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
12
PS> [cultureinfo]::CurrentCulture = 'en'
PS> 1.2 -replace ','
1.2
Med funktionen aktiverad:
PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
1.2
PSDesiredStateConfiguration.InvokedscResource
Aktiverar kompilering till MOF på icke-Windows system och möjliggör användning av Invoke-DSCResource utan LCM.
I tidigare förhandsversioner av PowerShell 7.2 var den här funktionen aktiverad som standard. Från och med PowerShell 7.2-preview7 har modulen PSDesiredStateConfiguration tagits 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 med Enable-ExperimentalFeature .
PSImplicitRemotingBatching
Anteckning
Den här experimentella funktionen har tagits bort i PowerShell 7.2 och stöds inte längre.
Den här funktionen undersöker kommandot som har skrivits i gränssnittet, och om alla kommandon är implicita fjärrkommunikationsproxykommandon som utgör en enkel pipeline, batchas kommandona tillsammans och anropas som en enda fjärrpipeline.
Exempel:
# Create remote session and import TestIMod module
$s = nsn -host remoteMachine
icm $s { ipmo 'C:\Users\user\Documents\WindowsPowerShell\Modules\TestIMod\TestIMod.psd1' }
Import-PSSession $s -mod testimod
$maxProcs = 1000
$filter = 'pwsh','powershell*','wmi*'
# Without batching, this pipeline takes approximately 12 seconds to run
Measure-Command { Get-AllProcesses -MaxCount $maxProcs | Select-Custom $filter | Group-Stuff $filter }
Days : 0
Hours : 0
Minutes : 0
Seconds : 12
Milliseconds : 463
# But with the batching experimental feature enabled, it takes approximately 0.20 seconds
Measure-Command { Get-AllProcesses -MaxCount $maxProcs | Select-Custom $filter | Group-Stuff $filter }
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 209
När batchbearbetningsfunktionen är aktiverad ovan är alla tre implicita fjärrkommunikationsproxykommandon, , , , som körs i fjärrsessionen, och resultatet från pipelinen är de enda data som returneras till Get-AllProcesses Select-Custom Group-Stuff klienten. Detta minskar mängden data som skickas fram och tillbaka mellan klienten och fjärrsessionen och minskar även mängden objektserialisering och deserialisering.
PSLoadAssemblyFromNativeCode
Exponerar ett API för att tillåta sammansättningsläsning från intern kod.
PSNativeCommandArgumentPassing
När den här experimentella funktionen är aktiverad använder PowerShell egenskapen för objektet i stället för vår nuvarande mekanism för att rekonstruera en sträng vid anrop av ArgumentList StartProcessInfo en intern körbar fil.
Varning
Det nya beteendet är en stor förändring från det aktuella beteendet. Detta kan bryta skript och automatisering som kan lösa de olika problemen när interna program anrops. Tidigare måste citattecken vara rymda och det går inte att ange tomma argument till ett inbyggt program.
Den här funktionen lägger till en ny $PSNativeCommandArgumentPassing automatisk variabel som gör att du kan välja beteende vid körning. Giltiga värden är Legacy , Standard och Windows . Legacy är det historiska beteendet. Standardvärdet när den experimentella funktionen är aktiverad är det nya Standard beteendet.
När inställningsvariabeln är Windows inställd på använder anrop av följande filer automatiskt Legacy formatargumentet som skickas.
cmd.execscript.exewscript.exe- slutar med
.bat - slutar med
.cmd - slutar med
.js - slutar med
.vbs - slutar med
.wsf
Om $PSNativeArgumentPassing är inställt på Legacy antingen Standard eller sker inte kontrollen för dessa filer. Standardbeteendet är plattformsspecifikt. På Windows är standardinställningen och Windows icke-Windows plattformar är Standard .
Nya beteenden som görs tillgängliga med den här ändringen:
Literala eller expanderbara strängar med inbäddade citattecken bevaras nu:
PS > $a = 'a" "b' PS > $PSNativeCommandArgumentPassing = "Legacy" PS > testexe -echoargs $a 'a" "b' a" "b Arg 0 is <a b> Arg 1 is <a b> Arg 2 is <a b> PS > $PSNativeCommandArgumentPassing = "Standard" PS > testexe -echoargs $a 'a" "b' a" "b Arg 0 is <a" "b> Arg 1 is <a" "b> Arg 2 is <a b>Tomma strängar som argument bevaras nu:
PS> $PSNativeCommandArgumentPassing = "Legacy" PS> testexe -echoargs '' a b '' Arg 0 is <a> Arg 1 is <b> PS> $PSNativeCommandArgumentPassing = "Standard" PS> testexe -echoargs '' a b '' Arg 0 is <> Arg 1 is <a> Arg 2 is <b> Arg 3 is <>
Det nya beteendet ändrar inte anrop som ser ut så här:
PS> $PSNativeCommandArgumentPassing = "Legacy"
PS> testexe -echoargs -k com:port=\\devbox\pipe\debug,pipe,resets=0,reconnect
Arg 0 is <-k>
Arg 1 is <com:port=\\devbox\pipe\debug,pipe,resets=0,reconnect>
PS> $PSNativeCommandArgumentPassing = "Standard"
PS> testexe -echoargs -k com:port=\\devbox\pipe\debug,pipe,resets=0,reconnect
Arg 0 is <-k>
Arg 1 is <com:port=\\devbox\pipe\debug,pipe,resets=0,reconnect>
Dessutom tillhandahålls nu parameterspårning så innehåller Trace-Command användbar information för felsökning.
PS> $PSNativeCommandArgumentPassing = "Legacy"
PS> trace-command -PSHOST -Name ParameterBinding { testexe -echoargs $a 'a" "b' a" "b }
DEBUG: 2021-02-01 17:19:53.6438 ParameterBinding Information: 0 : BIND NAMED native application line args [/Users/james/src/github/forks/jameswtruher/PowerShell-1/test/tools/TestExe/bin/testexe]
DEBUG: 2021-02-01 17:19:53.6440 ParameterBinding Information: 0 : BIND argument [-echoargs a" "b a" "b "a b"]
DEBUG: 2021-02-01 17:19:53.6522 ParameterBinding Information: 0 : CALLING BeginProcessing
Arg 0 is <a b>
Arg 1 is <a b>
Arg 2 is <a b>
PS> $PSNativeCommandArgumentPassing = "Standard"
PS> trace-command -PSHOST -Name ParameterBinding { testexe -echoargs $a 'a" "b' a" "b }
DEBUG: 2021-02-01 17:20:01.9829 ParameterBinding Information: 0 : BIND NAMED native application line args [/Users/james/src/github/forks/jameswtruher/PowerShell-1/test/tools/TestExe/bin/testexe]
DEBUG: 2021-02-01 17:20:01.9829 ParameterBinding Information: 0 : BIND cmd line arg [-echoargs] to position [0]
DEBUG: 2021-02-01 17:20:01.9830 ParameterBinding Information: 0 : BIND cmd line arg [a" "b] to position [1]
DEBUG: 2021-02-01 17:20:01.9830 ParameterBinding Information: 0 : BIND cmd line arg [a" "b] to position [2]
DEBUG: 2021-02-01 17:20:01.9831 ParameterBinding Information: 0 : BIND cmd line arg [a b] to position [3]
DEBUG: 2021-02-01 17:20:01.9908 ParameterBinding Information: 0 : CALLING BeginProcessing
Arg 0 is <a" "b>
Arg 1 is <a" "b>
Arg 2 is <a b>
PSNativePSPathResolution
Om en PSDrive-sökväg som använder FileSystem-providern skickas till ett inbyggt kommando skickas den lösta sökvägen till det inbyggda kommandot. Det innebär att ett kommando som code temp:/test.txt nu fungerar som förväntat.
Om sökvägen Windows med , matchas 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 (på Windows) sker inte sökvägs normalisering - Om sökvägen är inom enkla citattecken matchas den inte och behandlas inte som literal
PSNotApplyErrorActionToStderr
När den här experimentella funktionen är aktiverad skrivs inte felposter som omdirigeras från interna kommandon, t.ex. när du använder omdirigeringsoperatorer ( ), till variabeln och inställningsvariabeln påverkar inte 2>&1 $Error de $ErrorActionPreference omdirigerade utdata.
Många interna kommandon skriver till stderr som en alternativ dataström för ytterligare information. Det här beteendet kan orsaka förvirring när du tittar igenom fel eller om ytterligare utdatainformation kan gå förlorad för användaren om har angetts till ett tillstånd som $ErrorActionPreference stänger av utdata.
När ett inbyggt kommando har en slutkod som inte är $? noll anges till $false . Om slutkoden är noll anges $? till $true .
PSNullConditionalOperators
Introducerar nya operatorer för villkorsstyrd åtkomst för Null-medlemmar – ?. och ?[] . Operatorer för nullmedlemsåtkomst kan användas på skalärtyper och matristyper. Returnera värdet för den använda medlemmen om variabeln inte är null. Om värdet för variabeln är null returnerar du null.
$x = $null
${x}?.propname
${x?}?.propname
${x}?[0]
${x?}?[0]
${x}?.MyMethod()
Egenskapen propname nås och dess värde returneras endast om $x inte är null. På samma sätt används indexeraren bara om $x inte är null. Om $x är null returneras null.
Operatorerna ?. ?[] och är operatorer för medlemsåtkomst och tillåter inte blanksteg mellan variabelnamnet och operatorn.
Eftersom PowerShell tillåter som en del av variabelnamnet krävs tvetydighet när operatorerna används utan blanksteg mellan ? variabelnamnet och operatorn. För att undvika tvetydigheter måste variablerna använda runt {} variabelnamnet som: ${x?}?.propertyName eller ${y}?[0] .
Anteckning
Den här funktionen har flyttats från den experimentella fasen och är en vanlig funktion i PowerShell 7.1 och senare.
PSUnixFileStat
Den här funktionen tillhandahåller mer Unix-liknande fillistor genom att inkludera data från UNIX-statistik-API:et. Den lägger till en ny anteckningsegenskap i filsystemsprovidern med namnet UnixStat som innehåller en återgivning av information från stat(2) Unix-API:et.
Utdata från Get-ChildItem bör se ut ungefär så här:
dir | select -first 4 -skip 5
Directory: /Users/jimtru/src/github/forks/JamesWTruher/PowerShell-1
UnixMode User Group LastWriteTime Size Name
-------- ---- ----- ------------- ---- ----
drwxr-xr-x jimtru staff 10/23/2019 13:16 416 test
drwxr-xr-x jimtru staff 11/8/2019 10:37 896 tools
-rw-r--r-- jimtru staff 11/8/2019 10:37 112858 build.psm1
-rw-r--r-- jimtru staff 11/8/2019 10:37 201297 CHANGELOG.md
Anteckning
Den här funktionen har flyttats från den experimentella fasen och är en vanlig funktion i PowerShell 7.1 och senare.
PSSubsystemPluginModel
Den här funktionen aktiverar undersystemets plugin-modell i PowerShell. Funktionen gör det möjligt att separera komponenter i System.Management.Automation.dll i enskilda undersystem som finns i en 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 undersystemet CommandPredictor. Det här undersystemet används tillsammans med PSReadLine-modulen för att tillhandahålla anpassade förutsägelse-plugin-program. I framtiden kan Job, CommandCompleter, Fjärrkommunikation och andra komponenter delas upp i undersystemsammansättningar utanför System.Management.Automation.dll .
Den experimentella funktionen innehåller en ny cmdlet, Get-PSSubsystem. Den här cmdleten är bara tillgänglig när funktionen är aktiverad. Denna cmdlet returnerar information om de undersystem som är tillgängliga i systemet.