Experimentele functies gebruiken in PowerShell

De ondersteuning voor experimentele functies in PowerShell biedt een mechanisme voor experimentele functies die naast bestaande stabiele functies in PowerShell- of PowerShell-modules kunnen worden gebruikt.

Een experimentele functie is een functie waarbij het ontwerp niet is afgerond. De functie is beschikbaar voor gebruikers om te testen en feedback te geven. Zodra een experimentele functie is afgerond, worden de ontwerpwijzigingen belangrijke wijzigingen.

Waarschuwing

Experimentele functies zijn niet bedoeld om te worden gebruikt in productie, omdat de wijzigingen mogen worden doorgevoerd. Experimentele functies worden niet officieel ondersteund. We stellen feedback en foutrapporten echter zeer op prijs. U kunt problemen in de bronopslagplaats GitHub bestand.

Zie voor meer informatie over het in- of uitschakelen van deze functies about_Experimental_Features.

Beschikbare functies

In dit artikel worden de experimentele functies beschreven die beschikbaar zijn en hoe u de functie gebruikt.

Legenda

  • ✔️ geeft aan dat de experimentele functie beschikbaar is in de versie van PowerShell
  • ✅ geeft de versie van PowerShell aan waar de experimentele functie gangbare werd
  • ❌ geeft de versie van PowerShell aan waarin de experimentele functie is verwijderd
Naam 7.0 7.1 7.2
PSNullConditionalOperators ✔️
PSUnixFileStat (alleen niet-Windows) ✔️ ✔️
Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace ✔️ ✔️
PSCultureInvariantReplaceOperator ✔️
PSNotApplyErrorActionToStderr ✔️
PSImplicitRemotingBatching ✔️ ✔️
PSCommandNotFoundSuggestion ✔️ ✔️ ✔️
PSDesiredStateConfiguration.InvokeDscResource ✔️ ✔️ ✔️
PSNativePSPathResolution ✔️ ✔️
PSSubsystemPluginModel ✔️ ✔️
PSNativeCommandArgumentPassing ✔️
PSAnsiRenderingFileInfo ✔️
PSLoadAssemblyFromNativeCode ✔️

Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace

Notitie

Deze functie is gangbare geworden in PowerShell 7.2.

In PowerShell 7.0 schakelt het experiment de parameter BreakAll in op de cmdlets en om gebruikers in staat te stellen te bepalen of ze willen dat PowerShell direct wordt beschadigd op de huidige locatie wanneer ze een Debug-Runspace Debug-Job debugger koppelen.

In PowerShell 7.1 voegt dit experiment ook de parameter Runspace toe aan de *-PSBreakpoint cmdlets.

  • Disable-PSBreakpoint
  • Enable-PSBreakpoint
  • Get-PSBreakpoint
  • Remove-PSBreakpoint
  • Set-PSBreakpoint

De Runspace parameter geeft u een Runspace-object om te communiceren met onderbrekingspunten in de opgegeven runspace.

Start-Job -ScriptBlock {
    Set-PSBreakpoint -Command Start-Sleep
    Start-Sleep -Seconds 10
}

$runspace = Get-Runspace -Id 1

$breakpoint = Get-PSBreakPoint -Runspace $runspace

In dit voorbeeld wordt een taak gestart en wordt een onderbrekingspunt ingesteld om te worden breekt wanneer Set-PSBreakPoint de wordt uitgevoerd. De runspace wordt opgeslagen in een variabele en doorgegeven aan de Get-PSBreakPoint opdracht met de parameter Runspace. Vervolgens kunt u het onderbrekingspunt in de variabele $breakpoint inspecteren.

PSAnsiRenderingFileInfo

Dit experiment is toegevoegd in PowerShell 7.2. Deze functie voegt het lid $PSStyle.FileInfo toe en maakt het kleuren van specifieke bestandstypen mogelijk.

  • $PSStyle.FileInfo.Directory - Ingebouwd lid om kleur op te geven voor directories
  • $PSStyle.FileInfo.SymbolicLink - Ingebouwd lid om kleur op te geven voor symbolische koppelingen
  • $PSStyle.FileInfo.Executable - Ingebouwd lid om kleur op te geven voor uitvoerbare bestanden.
  • $PSStyle.FileInfo.Extension - Gebruik dit lid om kleuren te definiëren voor verschillende bestandsextensies. Het extensielid bevat vooraf extensies voor archief- en PowerShell-bestanden.

Zie voor meer informatie about_Automatic_Variables.

Notitie

U moet de experimentele functie PSAnsiRendering hebben ingeschakeld om deze functie te kunnen gebruiken.

PSCommandNotFoundSuggestion

Raadt potentiële opdrachten aan op basis van fuzzy zoekopdrachten na een 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

Wanneer de linkeropend in een operator-instructie geen tekenreeks is, wordt die -replace operand geconverteerd naar een tekenreeks.

Wanneer deze functie is uitgeschakeld, wordt -replace er een cultuurgevoelige tekenreeksconversie door de operator gemaakt. Als uw cultuur bijvoorbeeld is ingesteld op Frans (fr), wordt de 1.2 waarde geconverteerd naar de tekenreeks 1,2 .

PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
12
PS> [cultureinfo]::CurrentCulture = 'en'
PS> 1.2 -replace ','
1.2

Met de functie ingeschakeld:

PS> [cultureinfo]::CurrentCulture = 'fr'
PS> 1.2 -replace ','
1.2

PSDesiredStateConfiguration.InvokeDscResource

Hiermee schakelt u compilatie naar MOF op niet-Windows systemen en maakt het gebruik van Invoke-DSCResource zonder een LCM mogelijk.

In eerdere previews van PowerShell 7.2 was deze functie standaard ingeschakeld. Vanaf PowerShell 7.2-preview7 is de module PSDesiredStateConfiguration verwijderd en is deze functie standaard uitgeschakeld. Als u deze functie wilt inschakelen, moet u de module PSDesiredStateConfiguration v2.0.5 installeren vanuit de PowerShell Gallery en de functie inschakelen met behulp van Enable-ExperimentalFeature .

PSImplicitRemotingBatching

Notitie

Deze experimentele functie is verwijderd in PowerShell 7.2 en wordt niet meer ondersteund.

Deze functie onderzoekt de opdracht die in de shell is getypt. Als alle opdrachten impliciet proxyopdrachten voor externe toegang zijn die een eenvoudige pijplijn vormen, worden de opdrachten in batche bij elkaar gezet en aangeroepen als één externe pijplijn.

Voorbeeld:

# 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

Zoals hierboven is te zien, worden met de batchfunctie ingeschakeld alle drie impliciete proxyopdrachten voor externe toegang, , , uitgevoerd in de externe sessie. Het resultaat van de pijplijn is de enige gegevens die worden geretourneerd naar de Get-AllProcesses Select-Custom Group-Stuff client. Dit vermindert de hoeveelheid gegevens die tussen client en externe sessie heen en weer worden verzonden, en vermindert ook de hoeveelheid objectser serialisatie en deseralisatie.

PSLoadAssemblyFromNativeCode

Maakt een API beschikbaar voor het laden van assembly's vanuit native code.

PSNativeCommandArgumentPassing

Wanneer deze experimentele functie is ingeschakeld, gebruikt PowerShell de eigenschap van het object in plaats van ons huidige mechanisme voor het reconstrueren van een tekenreeks bij het aanroepen van een ArgumentList StartProcessInfo systeemeigen uitvoerbaar bestand.

Waarschuwing

Het nieuwe gedrag is een wijziging die de huidige situatie verbreekt. Dit kan leiden tot problemen met scripts en automatisering die de verschillende problemen oplossen bij het aanroepen van native toepassingen. Van oudsher moeten aanhalingstekens worden voorzien van een escape-escape en is het niet mogelijk om lege argumenten op te geven voor een native toepassing.

Met deze functie wordt een nieuwe automatische variabele $PSNativeCommandArgumentPassing toegevoegd waarmee u het gedrag tijdens runtime kunt selecteren. De geldige waarden zijn Legacy , Standard en Windows . Legacy is het historische gedrag. De standaardwaarde wanneer de experimentele functie is ingeschakeld, is het nieuwe Standard gedrag.

Wanneer de voorkeursvariabele is ingesteld op , gebruiken aanroepen van de volgende bestanden automatisch het door te geven Windows Legacy stijlargument.

  • cmd.exe
  • cscript.exe
  • wscript.exe
  • eindigend op .bat
  • eindigend op .cmd
  • eindigend op .js
  • eindigend op .vbs
  • eindigend op .wsf

Als de $PSNativeArgumentPassing is ingesteld op of , wordt de controle voor deze bestanden niet Legacy Standard uitgevoerd. Het standaardgedrag is platformsyte specifiek. Op Windows platformen is de standaardinstelling Windows en niet-Windows Standard platformen.

Nieuwe gedragingen die beschikbaar worden gesteld door deze wijziging:

  • Letterlijke of uitbreidbare tekenreeksen met ingesloten aanhalingstekens blijven nu behouden:

    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>
    
  • Lege tekenreeksen als argumenten blijven nu behouden:

    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 <>
    

Het nieuwe gedrag verandert geen aanroepen die er als volgende uitzien:

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>

Daarnaast is parametertracing nu beschikbaar, zodat nuttige Trace-Command informatie biedt voor het opsporen van gegevens.

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

Als een PSDrive-pad dat gebruikmaakt van de FileSystem-provider wordt doorgegeven aan een systeemeigen opdracht, wordt het om opgeloste bestandspad doorgegeven aan de systeemeigen opdracht. Dit betekent dat een opdracht zoals code temp:/test.txt nu werkt zoals verwacht.

Als het pad Windows, wordt dit ook in het Windows opgelost naar het volledige pad en ~ doorgegeven aan de native opdracht. In beide gevallen wordt het pad genormaliseerd naar de mapscheidingstekens voor het relevante besturingssysteem.

  • Als het pad geen PSDrive of ~ (op Windows) is, wordt padnormalisatie niet uitgevoerd
  • Als het pad tussen enkele aanhalingstekens staat, wordt het niet opgelost en behandeld als letterlijke

PSNotApplyErrorActionToStderr

Wanneer deze experimentele functie is ingeschakeld, worden foutrecords die worden omgeleid vanuit native opdrachten, zoals bij het gebruik van omleidingsoperators ( ), niet naar de variabele geschreven en heeft de voorkeursvariabele geen invloed op de 2>&1 $Error omgeleide $ErrorActionPreference uitvoer.

Veel native opdrachten schrijven naar stderr als een alternatieve stroom voor aanvullende informatie. Dit gedrag kan verwarring veroorzaken bij het zoeken door fouten of de aanvullende uitvoergegevens kunnen verloren gaan voor de gebruiker als is ingesteld op een status die $ErrorActionPreference de uitvoer dempt.

Wanneer een native opdracht een afsluitende code heeft die niet nul $? is, wordt ingesteld op $false . Als de afsluitende code nul is, $? wordt ingesteld op $true .

PSNullConditionalOperators

Introduceert nieuwe operators voor operators voor voorwaardelijke toegang tot null-leden - ?. en ?[] . Null-operators voor lidtoegang kunnen worden gebruikt voor scalaire typen en matrixtypen. Retourneert de waarde van het lid dat toegang heeft als de variabele niet null is. Als de waarde van de variabele null is, retourneert u null.

$x = $null
${x}?.propname
${x?}?.propname

${x}?[0]
${x?}?[0]

${x}?.MyMethod()

De eigenschap wordt gebruikt en de waarde wordt alleen geretourneerd propname als $x niet null is. Op dezelfde manier wordt de indexer alleen gebruikt als $x niet null is. Als $x null is, wordt null geretourneerd.

De operators en zijn operators voor lidtoegang en staan geen spatie toe tussen de naam van de ?. ?[] variabele en de operator.

Aangezien PowerShell het als onderdeel van de variabelenaam toestaat, is ondubbelzinnigheid vereist wanneer de operators worden gebruikt zonder spatie tussen de naam van de variabele ? en de operator. Om ondubbelzinnig te zijn, moeten de variabelen rond de variabelenaam {} gebruiken, ${x?}?.propertyName zoals: of ${y}?[0] .

Notitie

Deze functie is uit de experimentele fase verplaatst en is een algemene functie in PowerShell 7.1 en hoger.

PSUnixFileStat

Deze functie biedt meer Unix-achtige bestandsvermeldingen door gegevens van de Unix stat API op te geven. Er wordt een nieuwe notitie-eigenschap toegevoegd aan de bestandssysteemprovider met de naam UnixStat, die een weergave van informatie van de Unix-API stat(2) bevat.

De uitvoer van Get-ChildItem moet er als de volgende uitzien:

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

Notitie

Deze functie is uit de experimentele fase verplaatst en is een algemene functie in PowerShell 7.1 en hoger.

PSSubsystemPluginModel

Met deze functie schakelt u het invoegmodel van het subsysteem in PowerShell in. De functie maakt het mogelijk om onderdelen van te System.Management.Automation.dll scheiden in afzonderlijke subsystemen die zich in hun eigen assembly bevinden. Door deze scheiding wordt de schijfvoetafdruk van de PowerShell-kernentafdruk verkleind en kunnen deze onderdelen optionele functies worden voor een minimale PowerShell-installatie.

Momenteel wordt alleen het subsysteem CommandPredictor ondersteund. Dit subsysteem wordt samen met de PSReadLine-module gebruikt om aangepaste voorspellingsinvoegingen te bieden. In de toekomst kunnen Taak, CommandCompleter, Externe externe mogelijkheden en andere onderdelen worden gescheiden in subsysteemassemblage buiten System.Management.Automation.dll .

De experimentele functie bevat een nieuwe cmdlet, Get-PSSubsystem. Deze cmdlet is alleen beschikbaar wanneer de functie is ingeschakeld. Deze cmdlet retourneert informatie over de subsystemen die beschikbaar zijn op het systeem.