Experimentele functies gebruiken in PowerShell

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

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

Waarschuwing

Experimentele functies zijn niet bedoeld voor gebruik in productie omdat de wijzigingen mogen worden onderbroken. Experimentele functies worden niet officieel ondersteund. We waarderen echter alle feedback- en foutrapporten. U kunt problemen in de GitHub-bronopslagplaats opslaan.

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

Beschikbare functies

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

Legenda

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

Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace

Notitie

Deze functie werd basis in PowerShell 7.2.

In PowerShell 7.0 schakelt het experiment de parameter BreakAll in op de Debug-Runspace cmdlets Debug-Job , zodat gebruikers kunnen bepalen of PowerShell onmiddellijk op de huidige locatie moet worden onderbroken wanneer ze een foutopsporingsprogramma koppelen.

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

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

Met de parameter Runspace geeft u een Runspace-object op 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 breken wanneer de Set-PSBreakPoint taak 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 $breakpoint variabele inspecteren.

PSAMSIMethodInvocationLogging

De Windows Antimalware Scan Interface (AMSI) is een API waarmee toepassingen acties kunnen doorgeven aan een antimalwarescanner, zoals Windows Defender, voor het detecteren van schadelijke nettoladingen. Vanaf PowerShell 5.1 geeft PowerShell die wordt uitgevoerd op Windows 10 (en hoger) alle scriptblokken door aan AMSI.

Deze experimentele functie breidt de gegevens uit die naar AMSI worden verzonden voor inspectie. Als deze functie is ingeschakeld, voegt PowerShell alle aanroepen van .NET-methodeleden toe.

Dit experiment is toegevoegd in PowerShell 7.3.

Zie Hoe AMSI helpt voor meer informatie over AMSI.

PSAnsiRenderingFileInfo

Dit experiment is toegevoegd in PowerShell 7.2. Met deze functie wordt het lid $PSStyle.FileInfo toegevoegd en wordt het kleuren van specifieke bestandstypen ingeschakeld.

  • $PSStyle.FileInfo.Directory - Ingebouwd lid om kleur op te geven voor mappen
  • $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 about_Automatic_Variables voor meer informatie.

Notitie

Deze functie is afhankelijk van de PSAnsiRendering-functie die nu een standaardfunctie is.

PSCleanBlock

Het clean blok is een handige manier voor gebruikers om resources op te schonen die zich over de beginprocessene en end de blokken heen beslaan. Het is semantisch vergelijkbaar met een finally blok dat alle andere benoemde blokken van een scriptfunctie of een script-cmdlet dekt. Het opschonen van resources wordt afgedwongen voor de volgende scenario's:

  1. wanneer de uitvoering van de pijplijn normaal is voltooid zonder afsluitfout
  2. wanneer de uitvoering van de pijplijn wordt onderbroken vanwege een afsluitfout
  3. wanneer de pijplijn wordt gestopt door Select-Object -First
  4. wanneer de pijplijn wordt gestopt door Ctrl+c of StopProcessing()

Waarschuwing

Het toevoegen van het clean blok is een belangrijke wijziging. Omdat clean deze wordt geparseerd als trefwoord, voorkomt u dat gebruikers rechtstreeks een opdracht aanroepen met de naam clean van de eerste instructie in een scriptblok. Het is echter waarschijnlijk een niet-probleem in de meeste praktische gevallen en wanneer dat het geval is, kan de opdracht nog steeds worden aangeroepen met de aanroepoperator (& clean).

Zie RFC0059 in de PowerShell/PowerShell-RFC-opslagplaats voor meer informatie over deze experimentele functie.

PSCommandNotFoundSuggestion

Beveelt potentiële opdrachten aan op basis van fuzzy overeenkomende 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 linkeroperand in een -replace operatorinstructie geen tekenreeks is, wordt die operand geconverteerd naar een tekenreeks.

Wanneer deze functie is uitgeschakeld, voert de -replace operator een cultuurgevoelige tekenreeksconversie uit. Als uw cultuur bijvoorbeeld is ingesteld op Frans (fr), wordt de waarde 1.2 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

Als de functie is ingeschakeld, gaat u als volgende te werk:

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

PSDesiredStateConfiguration.InvokeDscResource

Maakt compilatie mogelijk voor MOF op niet-Windows-systemen en maakt het gebruik van Invoke-DSCResource zonder LCM mogelijk.

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

PSExec

Sommige systeemeigen Unix-opdrachten worden uitgevoerd om iets (zoals ssh) uit te voeren en de bash ingebouwde opdracht exec te gebruiken om een nieuw proces uit te voeren dat de huidige vervangt. Is standaard exec geen geldige opdracht in PowerShell. Dit is van invloed op enkele bekende scripts, zoals copy-ssh-id en enkele subopdrachten van AzCLI.

Met de PSExec experimentele functie wordt een nieuwe Switch-Process cmdlet met alias toegevoegd aan exec. De cmdlet roept execv() de functie aan om vergelijkbaar gedrag te bieden als POSIX-shells.

De PSExec experimentele functie moet zijn ingeschakeld om deze cmdlet beschikbaar te maken. Deze cmdlet is alleen beschikbaar voor niet-Windows-systemen.

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 en als alle opdrachten impliciete externe proxyopdrachten zijn die een eenvoudige pijplijn vormen, worden de opdrachten samengevoegd 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 gezien, worden alle drie de impliciete externe proxyopdrachtenGet-AllProcessesSelect-CustomGroup-Stuff, uitgevoerd in de externe sessie, en het resultaat van de pijplijn is de enige gegevens die naar de client worden geretourneerd. Dit vermindert de hoeveelheid gegevens die heen en weer worden verzonden tussen client en externe sessie, en vermindert ook de hoeveelheid objectserialisatie en deserialisatie.

PSLoadAssemblyFromNativeCode

Hiermee wordt een API beschikbaar gesteld om het laden van assembly's vanuit systeemeigen code toe te staan.

PSNativeCommandArgumentPassing

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

Waarschuwing

Het nieuwe gedrag is een belangrijke wijziging van huidig gedrag. Hierdoor kunnen scripts en automatisering worden verbroken die de verschillende problemen omzeilen bij het aanroepen van systeemeigen toepassingen. In het verleden moeten aanhalingstekens worden ontsnapt en is het niet mogelijk om lege argumenten op te geven voor een systeemeigen toepassing.

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

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

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

Als de $PSNativeArgumentPassing optie is ingesteld op een Legacy of Standard, wordt de controle op deze bestanden niet uitgevoerd. Het standaardgedrag is platformspecifiek. Op Windows-platforms is Windows de standaardinstelling en niet-Windows-platforms.Standard

Nieuw gedrag beschikbaar gemaakt door deze wijziging:

  • Letterlijke of uitvouwbare 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 volgt 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 wordt er nu parametertracering geboden, dus Trace-Command biedt nuttige informatie voor foutopsporing.

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>

PSNativeCommandErrorActionPreference

Systeemeigen opdrachten retourneren meestal een afsluitcode naar de aanroepende toepassing die nul is voor succes of niet-nul voor fouten. Systeemeigen opdrachten nemen momenteel echter niet deel aan de PowerShell-foutstroom. Omgeleide stderr-uitvoer wordt niet hetzelfde geïnterpreteerd als de PowerShell-foutstroom. Veel systeemeigen opdrachten gebruiken stderr als informatie of uitgebreide stream, dus alleen de afsluitcode is belangrijk. Gebruikers die met systeemeigen opdrachten in hun scripts werken, moeten na elke aanroep de afsluitstatus controleren met behulp van hetzelfde voorbeeld:

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

Het gewoon doorgeven van de fouten via de foutstroom is niet de oplossing. Het voorbeeld zelf biedt geen ondersteuning voor alle gevallen waarin onwaar kan zijn van een cmdlet of functiefout, waardoor $? het verouderd wordt $LASTEXITCODE .

Met deze functie wordt een voorkeursvariabele geïmplementeerd om fouten in te schakelen die worden geproduceerd door systeemeigen opdrachten als PowerShell-fouten. Hierdoor kunnen systeemeigen opdrachtfouten foutobjecten produceren die worden toegevoegd aan de PowerShell-foutstroom die de uitvoering van het script kan beëindigen zonder extra verwerking.

Voer de volgende opdrachten uit om deze functie in te schakelen:

Enable-ExperimentalFeature PSNativeCommandErrorActionPreference

U moet een nieuwe PowerShell-sessie starten om deze wijziging van kracht te laten zijn. In de nieuwe sessie moet u de nieuwe voorkeursvariabele instellen:

$PSNativeCommandUseErrorActionPreference = $true

PSNativePSPathResolution

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

Als het pad begint met ~Windows, wordt dit ook omgezet in het volledige pad en doorgegeven aan de systeemeigen opdracht. In beide gevallen wordt het pad genormaliseerd naar de adreslijstscheidingstekens voor het relevante besturingssysteem.

  • Als het pad geen PSDrive of ~ (in Windows) is, wordt de padnormalisatie niet uitgevoerd
  • Als het pad tussen enkele aanhalingstekens staat, wordt het niet omgezet en behandeld als letterlijk

PSNotApplyErrorActionToStderr

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

Veel systeemeigen opdrachten schrijven naar stderr als een alternatieve stream voor aanvullende informatie. Dit gedrag kan verwarring veroorzaken bij het bekijken van fouten of de aanvullende uitvoergegevens kunnen verloren gaan voor de gebruiker als $ErrorActionPreference deze is ingesteld op een status waarmee de uitvoer wordt gedempt.

Wanneer een systeemeigen opdracht een afsluitcode zonder nul heeft, $? is deze ingesteld op $false. Als de afsluitcode nul is, $? is ingesteld op $true.

PSNullConditionalOperators

Introduceert nieuwe operators voor operatoren voor voorwaardelijke toegang tot null-leden en ?.?[]. Toegangsoperators voor null-leden kunnen worden gebruikt voor scalaire typen en matrixtypen. Retourneert de waarde van het geopende lid 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 propname wordt geopend en de waarde wordt alleen geretourneerd als $x deze niet null is. Op dezelfde manier wordt de indexeerfunctie alleen gebruikt als $x deze niet null is. Als $x null is, wordt null geretourneerd.

De ?. operators en ?[] operators zijn operatoren voor toegang tot leden en staan geen spatie toe tussen de naam van de variabele en de operator.

Aangezien PowerShell als onderdeel van de naam van de variabele 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 naam van de variabele worden gebruikt {} , zoals: ${x?}?.propertyName of ${y}?[0].

Notitie

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

PSStrictModeAssignment

PowerShell 7.3-preview.2 voegt de parameter StrictMode toe om het opgeven van de strikte modus toe te Invoke-Command staan bij het lokaal aanroepen van de opdracht. Met de parameter StrictMode wordt de opgegeven versie voor het proces ingesteld. Zodra het proces is voltooid, wordt de versie StrictMode teruggezet op wat het was vóór de Invoke-Command.

Deze functie biedt geen ondersteuning voor asynchrone taken op externe machines.

PSUnixFileStat

Deze functie biedt meer Unix-achtige bestandsvermeldingen door gegevens uit de UNIX-stat-API op te slaan. Er wordt een nieuwe notitieeigenschap toegevoegd aan de bestandssysteemprovider UnixStat die een weergave van informatie uit de Unix-API stat(2) bevat.

De uitvoer van Get-ChildItem moet er ongeveer als volgt 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 basisfunctie in PowerShell 7.1 en hoger.

PSSubsystemPluginModel

Met deze functie wordt het subsysteeminvoegtoepassingsmodel ingeschakeld in PowerShell. De functie maakt het mogelijk om onderdelen van System.Management.Automation.dll afzonderlijke subsystemen te scheiden die zich in hun eigen assembly bevinden. Deze scheiding vermindert de schijfvoetafdruk van de PowerShell-kernengine en maakt het mogelijk dat deze onderdelen optionele functies worden voor een minimale PowerShell-installatie.

Momenteel wordt alleen het CommandPredictor-subsysteem ondersteund. Dit subsysteem wordt samen met de PSReadLine-module gebruikt om aangepaste voorspellingsinvoegtoepassingen te bieden. In de toekomst kunnen Job, CommandCompleter, Remoting en andere onderdelen worden gescheiden in subsysteemassembly's 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.