Verschillen tussen Windows PowerShell 5.1 en PowerShell 7.x
Windows PowerShell 5.1 is gebaseerd op de .NET Framework v4.5. Met de release van PowerShell 6.0 werd PowerShell een open source gebouwd op .NET Core 2.0. PowerShell 7.0 is gebaseerd op .NET Core 3.1. En met de release van PowerShell 7.2 wordt PowerShell gebouwd op .NET 6.0. Door over te .NET Framework naar .NET Core kon PowerShell een platformoverschrijdende oplossing worden. PowerShell wordt uitgevoerd op Windows, macOS en Linux.
Er zijn enkele verschillen in de PowerShell-taal tussen Windows PowerShell en PowerShell. De verschillen zijn het meest belangrijk in de beschikbaarheid en het gedrag van PowerShell-cmdlets tussen Windows- en niet-Windows-platforms en de wijzigingen die het gevolg zijn van de verschillen tussen de .NET Framework en .NET Core.
In dit artikel worden de belangrijkste verschillen en belangrijke wijzigingen Windows PowerShell en de huidige versie van PowerShell samengevat. Deze samenvatting bevat geen nieuwe functies of cmdlets die zijn toegevoegd. In dit artikel wordt ook niet besproken wat er tussen versies is veranderd. Het doel van dit artikel is om de huidige status van PowerShell weer te geven en te laten zien hoe dat verschilt van Windows PowerShell. Zie de artikelen Wat is er nieuw voor elke versie voor een gedetailleerde bespreking van wijzigingen tussen versies en de toevoeging van nieuwe functies.
.NET Framework vs. .NET Core
PowerShell in Linux en macOS maakt gebruik van .NET Core, een subset van de volledige .NET Framework op Microsoft Windows. Dit is belangrijk omdat PowerShell directe toegang biedt tot de onderliggende frameworktypen en -methoden. Als gevolg hiervan kunnen scripts die worden uitgevoerd op Windows mogelijk niet worden uitgevoerd op niet-Windows platformen vanwege de verschillen in de frameworks. Zie Voor meer informatie over wijzigingen in .NET Core Belangrijke wijzigingen voor migratie van .NET Framework naar .NET Core.
Met de komst van .NET Standard 2.0kan PowerShell veel traditionele Windows PowerShell laden zonder aanpassingen. Daarnaast bevat PowerShell 7 een Windows PowerShell-compatibiliteitsfunctie waarmee u Windows PowerShell modules kunt gebruiken waarvoor nog steeds het volledige framework nodig is.
Zie voor meer informatie:
Productterminologie die wordt gebruikt in de documentatie
De documentatie voor PowerShell bestaat uit twee typen inhoud: cmdlet-verwijzing en conceptuele inhoud. De cmdlet-verwijzing is specifiek voor de versie. U kunt van versie wisselen in de vervolgkeuzelijst linksboven op de pagina. De conceptuele inhoud verandert niet wanneer u versies wijzigt. Over het algemeen gelden de concepten voor alle versies van PowerShell, tenzij in het artikel een specifieke versie wordt beschreven.
- PowerShell: dit is de standaardnaam die we voor het product gebruiken. Wanneer we deze naam in de documentatie gebruiken, hebben we het over de huidige versie van PowerShell. Verschillen tussen PowerShell en Windows PowerShell worden aangegeven door de specifieke versie te noteren.
- Windows PowerShell: PowerShell gebouwd op .NET Framework. Windows PowerShell alleen op een Windows en vereist het volledige framework. Het is mogelijk om zowel PowerShell als powershell-Windows PowerShell op dezelfde computer Windows voeren.
Modules worden niet meer geleverd met PowerShell
Om verschillende compatibiliteitsredenen zijn de volgende modules niet meer opgenomen in PowerShell.
- ISE
- Microsoft.PowerShell.LocalAccounts
- Microsoft.PowerShell.ODataUtils
- Microsoft.PowerShell.Operation.Validation
- PSScheduledJob
- PSWorkflow
- PSWorkflowUtility
PowerShell-werkstroom
PowerShell Workflow is een functie in Windows PowerShell die is gebaseerd op Windows Workflow Foundation (WF) waarmee robuuste runbooks kunnen worden gemaakt voor langlopende of ge parallelliseerde taken.
Vanwege het gebrek aan ondersteuning voor Windows Workflow Foundation in .NET Core, is PowerShell Workflow verwijderd uit PowerShell.
In de toekomst willen we native parallellisme/gelijktijdigheid inschakelen in de PowerShell-taal zonder powershell-werkstroom.
Als er controlepunten moeten worden gebruikt om een script te hervatten nadat het besturingssysteem opnieuw is opgestart, raden we u aan Task Scheduler te gebruiken om een script uit te voeren bij het opstarten van het besturingssysteem, maar het script moet zijn eigen status behouden (zoals het persistent maken van het script naar een bestand).
Cmdlets verwijderd uit PowerShell
Voor de modules die zijn opgenomen in PowerShell, zijn de volgende cmdlets uit PowerShell verwijderd om verschillende compatibiliteitsredenen of het gebruik van niet-ondersteunde API's.
CimCmdlets
Export-BinaryMiLog
Microsoft.PowerShell.Core
Add-PSSnapinExport-ConsoleGet-PSSnapinRemove-PSSnapinResume-JobSuspend-Job
Microsoft.PowerShell.Diagnostics
Export-CounterImport-Counter
Microsoft.PowerShell.Management
Add-ComputerCheckpoint-ComputerClear-EventLogComplete-TransactionDisable-ComputerRestoreEnable-ComputerRestoreGet-ComputerRestorePointGet-ControlPanelItemGet-EventLogGet-TransactionGet-WmiObjectInvoke-WmiMethodLimit-EventLogNew-EventLogNew-WebServiceProxyRegister-WmiEventRemove-ComputerRemove-EventLogRemove-WmiObjectReset-ComputerMachinePasswordRestore-ComputerSet-WmiInstanceShow-ControlPanelItemShow-EventLogStart-TransactionTest-ComputerSecureChannelUndo-TransactionUse-TransactionWrite-EventLog
Microsoft.PowerShell.Utility
Convert-StringConvertFrom-String
PSDesiredStateConfiguration
Disable-DscDebugEnable-DscDebugGet-DscConfigurationGet-DscConfigurationStatusGet-DscLocalConfigurationManagerPublish-DscConfigurationRemove-DscConfigurationDocumentRestore-DscConfigurationSet-DscLocalConfigurationManagerStart-DscConfigurationStop-DscConfigurationTest-DscConfigurationUpdate-DscConfiguration
WMI v1-cmdlets
De volgende WMI v1-cmdlets zijn verwijderd uit PowerShell:
Register-WmiEventSet-WmiInstanceInvoke-WmiMethodGet-WmiObjectRemove-WmiObject
De cmdlets van de CimCmdlets-module (ook wel WMI v2 genoemd) voeren dezelfde functie uit en bieden nieuwe functionaliteit en een opnieuw ontworpen syntaxis.
New-WebServiceProxy cmdlet verwijderd
.NET Core biedt geen ondersteuning voor Windows Communication Framework, dat services biedt voor het gebruik van het SOAP-protocol. Deze cmdlet is verwijderd omdat SOAP vereist is.
*-Transaction cmdlets verwijderd
Deze cmdlets hadden een zeer beperkt gebruik. Er is besloten om de ondersteuning voor deze te stoppen.
Complete-TransactionGet-TransactionStart-TransactionUndo-TransactionUse-Transaction
*-EventLog Cmdlets
Vanwege het gebruik van niet-ondersteunde API's zijn de *-EventLog cmdlets verwijderd uit PowerShell.
Get-WinEventen New-WinEvent zijn beschikbaar om gebeurtenissen op te halen en te maken op Windows.
Cmdlets die gebruikmaken van Windows Presentation Framework (WPF)
.NET Core 3.1 heeft ondersteuning toegevoegd voor WPF, dus de release van PowerShell 7.0 heeft de volgende Windows specifieke functies hersteld:
- De
Show-Commandcmdlet - De
Out-GridViewcmdlet - De parameter ShowWindow van
Get-Help
Wijzigingen in PowerShell Desired State Configuration (DSC)
Invoke-DscResource is hersteld als een experimentele functie in PowerShell 7.0.
Vanaf PowerShell 7.2 is de module PSDesiredStateConfiguration verwijderd uit PowerShell en gepubliceerd naar de PowerShell Gallery. Zie de aankondiging in de PowerShell-teamblog voor meer informatie.
Engine-/taalwijzigingen
Naam van powershell.exe gewijzigd in pwsh.exe
De binaire naam voor PowerShell is gewijzigd van powershell(.exe) in pwsh(.exe) . Deze wijziging biedt een deterministische manier voor gebruikers om PowerShell op computers uit te voeren en ondersteuning te bieden voor side-by-side installaties van Windows PowerShell en PowerShell.
Aanvullende wijzigingen in pwsh(.exe) van powershell.exe :
- De eerste positionele parameter is gewijzigd van
-Commandin-File. Met deze wijziging wordt het gebruik van (ook wel een shebang) in PowerShell-scripts opgelost die worden uitgevoerd vanuit#!niet-PowerShell-shells op niet-Windows platformen. Dit betekent ook dat u opdrachten zoals of kuntpwsh foo.ps1uitvoeren zonder op tepwsh fooScript-Filegeven. Voor deze wijziging moet u echter expliciet opgeven of-cwanneer u opdrachten zoals probeert uit te-Commandpwsh.exe -Command Get-Commandvoeren. pwshaccepteert de-ischakelknop (of-Interactive) om een interactieve shell aan te geven. Hierdoor kan PowerShell worden gebruikt als een standaardshell op Unix-platforms.- Parameters en
-ImportSystemModulesverwijderd-PSConsoleFileuitpwsh.exe. - De
pwsh -versionen ingebouwde help voor ispwsh.exegewijzigd in overeenstemming met andere native hulpprogramma's. - Ongeldige argumentfoutberichten voor
-Fileen-Commanden exit-codes die consistent zijn met Unix-standaarden - Parameter
-WindowStyletoegevoegd aan Windows. Installatiesupdates op basis van pakketten op niet-Windows platformen zijn ook in-place updates.
De verkorte naam is ook consistent met de naamgeving van shells op niet-Windows platformen.
Ondersteuning voor het uitvoeren van een PowerShell-script met bool-parameter
Voorheen gebruikte ik om een PowerShell-script uit te voeren met pwsh.exe behulp van opgegeven geen manier om als -File $true / $false parameterwaarden door te geven. Ondersteuning voor $true / $false als geparseerde waarden aan parameters is toegevoegd. Switchwaarden worden ook ondersteund.
PowerShell ondersteunen als een standaard Unix-shell
In Unix is het een conventie voor shells om te accepteren voor een interactieve shell. Veel hulpprogramma's verwachten dit gedrag (bijvoorbeeld en bij het instellen van PowerShell als de standaardshell) en roept de shell aan met de -i script -i switch. Deze wijziging maakt een grote wijziging door dat eerder als korte hand kon worden gebruikt om overeen te komen met , wat -i -inputformat nu moet -in zijn.
Aangepaste module
PowerShell-modules zijn een voorloper van PowerShell-modules die niet wijdverbreid worden gebruikt in de PowerShell-community.
Vanwege de complexiteit van de ondersteuning van module-ins en het gebrek aan gebruik in de community, bieden we geen ondersteuning meer voor aangepaste module in PowerShell.
Experimentele functievlaggen
Ondersteuning voor experimentele functies is ingeschakeld. Hierdoor kunnen PowerShell-ontwikkelaars nieuwe functies leveren en feedback krijgen voordat het ontwerp is voltooid. Op deze manier voorkomen we dat er belangrijke wijzigingen worden aangebracht naarmate het ontwerp zich verder ontwikkelt.
Gebruik Get-ExperimentalFeature om een lijst met beschikbare experimentele functies op te halen. U kunt deze functies in- of uitschakelen met Enable-ExperimentalFeature en Disable-ExperimentalFeature .
Assembly laden vanaf het basispad van de module voordat u probeert te laden vanuit de GAC
Voorheen, wanneer een binaire module de module-assembly in GAC heeft, hebben we de assembly vanuit GAC geladen voordat we deze vanaf het basispad van de module proberen te laden.
Controle van null-elementen voor verzamelingen met een elementtype waarde overslaan
Voor de parameter en kenmerken slaat u de controle op null-elementen over of het elementtype van de Mandatory ValidateNotNull verzameling een ValidateNotNullOrEmpty waardetype is.
Behouden $? voor ParenExpression, SubExpression en ArrayExpression
Deze pr wijzigt de manier waarop we subpipelines, subexpressies en matrixexpressies compileren, zodat (...) $(...) niet automatisch waar @() $? is. In plaats daarvan is de waarde $? van afhankelijk van het resultaat van de uitgevoerde pijplijn of instructies.
Probleem $? opgelost dat niet is wanneer de native opdracht naar $false schrijft stderr
$? is niet ingesteld op wanneer $false de native opdracht naar stderr schrijft. Het is gebruikelijk dat native opdrachten naar schrijven stderr zonder een fout aan te geven. $? is alleen ingesteld op wanneer de native opdracht een afsluitende code heeft die niet $false nul is.
Uitvoer $ErrorActionPreference van native opdrachten niet stderr beïnvloeden
Het is gebruikelijk dat native opdrachten naar schrijven stderr zonder een fout aan te geven. Met deze wijziging wordt stderr de uitvoer nog steeds vastgelegd in ErrorRecord-objecten, maar de runtime is niet meer van toepassing als $ErrorActionPreference de ErrorRecord afkomstig is van een native opdracht.
Wijzigen $OutputEncoding in het gebruik van codering in plaats van UTF-8 NoBOM ASCII
De vorige codering, ASCII (7-bits), zou in sommige gevallen leiden tot een onjuiste wijziging van de uitvoer. Als UTF-8 NoBOM u de standaardinstelling maakt, blijft Unicode-uitvoer behouden met een codering die wordt ondersteund door de meeste hulpprogramma's en besturingssystemen.
Cmdlets met parameter van -Encoding het type samen te maken System.Text.Encoding
De -Encoding waarde is verwijderd uit de Byte cmdlets van de bestandssysteemprovider. Er wordt nu een nieuwe parameter, , gebruikt om op te geven dat een bytestroom is vereist als invoer of dat de uitvoer -AsByteStream een stroom bytes is.
Wijzig New-ModuleManifest encoding in UTF8NoBOM op niet-Windows platforms
Eerder maakt New-ModuleManifest psd1 manifesten in UTF-16 met BOM, waardoor er een probleem ontstaat voor Linux-hulpprogramma's. Deze belangrijke wijziging wijzigt de codering van in New-ModuleManifest UTF (geen bom) in niet-Windows platformen.
Verwijderen AllScope uit de meeste standaardaliassen
Om het maken van het bereik te versnellen, AllScope is verwijderd uit de meeste standaardaliassen. AllScope er werden enkele veelgebruikte aliassen gebruikt, waarbij de zoekactie sneller ging.
-Verbose en -Debug worden niet meer overschrijvingen $ErrorActionPreference
Eerder, als -Verbose of -Debug zijn opgegeven, is het gedrag van $ErrorActionPreference overschreven. Met deze wijziging en -Verbose niet langer van invloed op het gedrag van -Debug $ErrorActionPreference .
De parameter stelt -Debug ook in op Doorgaan $DebugPreference in plaats van Opvragen.
Consistent $PSCulture wijzigingen in de sessiecultuur weerspiegelen
In Windows PowerShell wordt de huidige cultuurwaarde in de cache opgeslagen, waardoor de waarde kan worden gesynchroniseerd met de cultuur is gewijzigd na het opstarten van de sessie. Dit cachinggedrag is opgelost in de PowerShell-kern.
Expliciet opgegeven benoemde parameter toestaan om dezelfde parameter te verzwelgen uit hashtabelsplatting
Met deze wijziging worden de benoemde parameters van splatting verplaatst naar het einde van de lijst met parameters, zodat ze zijn gebonden nadat alle expliciet opgegeven benoemde parameters zijn gebonden. Parameterbinding voor eenvoudige functies veroorzaakt geen fout wanneer een opgegeven benoemde parameter niet kan worden gevonden. Onbekende benoemde parameters zijn gebonden aan de $args parameter van de eenvoudige functie. Als u splatting naar het einde van de lijst met argumenten verplaatst, verandert de volgorde waarin de parameters worden weergegeven in $args .
Bijvoorbeeld:
function SimpleTest {
param(
$Name,
$Path
)
"Name: $Name; Path: $Path; Args: $args"
}
In het vorige gedrag is MyPath niet gebonden aan omdat dit het derde -Path argument in de lijst met argumenten is. ## Het wordt dus uiteindelijk samen met $args 'geseed' Blah = "World"
PS> $hash = @{ Name = "Hello"; Blah = "World" }
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: ; Args: -Blah: World MyPath
Met deze wijziging worden de argumenten @hash van verplaatst naar het einde van de lijst met argumenten. MyPath wordt het eerste argument in de lijst, dus het is gebonden aan -Path .
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: MyPath; Args: -Blah: World
Operator & toegevoegd voor taakbeheer
Als & u aan het einde van een pijplijn staat, wordt de pijplijn uitgevoerd als een PowerShell-taak. Wanneer een pijplijn een achtergrond heeft, wordt een taakobject geretourneerd. Zodra de pijplijn als een taak wordt uitgevoerd, kunnen alle *-Job standaard-cmdlets worden gebruikt om de taak te beheren. Variabelen (waarbij processpecifieke variabelen worden genegeerd) die in de pijplijn worden gebruikt, worden automatisch naar de taak gekopieerd, Copy-Item $foo $bar & zodat ze gewoon werken. De taak wordt ook uitgevoerd in de huidige map in plaats van in de basismap van de gebruiker.
Nieuwe methoden/eigenschappen op PSCustomObject
We hebben nieuwe methoden en eigenschappen toegevoegd aan PSCustomObject . PSCustomObjectbevat nu een Count / Length eigenschap zoals andere objecten.
$PSCustomObject = [pscustomobject]@{foo = 1}
$PSCustomObject.Length
1
$PSCustomObject.Count
1
Dit werk omvat ook ForEach methoden en waarmee u items kunt gebruiken en Where PSCustomObject filteren:
$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
1
Conversies van PSMethod naar Gemachtigden
U kunt een converteren PSMethod naar een gemachtigde. Hiermee kunt u dingen doen zoals het doorgeven PSMethod
[M]::DoubleStrLen als een gemachtigdenwaarde in [M]::AggregateString :
class M {
static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }
static [long] AggregateString([string[]] $values, [func[string, int]] $selector) {
[long] $res = 0
foreach($s in $values){
$res += $selector.Invoke($s)
}
return $res
}
}
[M]::AggregateString((gci).Name, [M]::DoubleStrLen)
Cmdlet-wijzigingen
Controleer system32 op compatibele ingebouwde modules op Windows
In de Windows 10 1809-update en Windows Server 2019 hebben we een aantal ingebouwde PowerShell-modules bijgewerkt om ze als compatibel met PowerShell te markeren.
Wanneer PowerShell wordt gestart, bevat het automatisch $windir\System32 als onderdeel van de PSModulePath omgevingsvariabele. De module wordt echter alleen beschikbaar gemaakt voor Get-Module en als de is gemarkeerd als compatibel met Import-Module CompatiblePSEdition Core .
U kunt dit gedrag overschrijven om alle modules weer te geven met behulp van de -SkipEditionCheck switchparameter.
We hebben ook een eigenschap PSEdition toegevoegd aan de tabeluitvoer.
-lp alias voor alle -LiteralPath parameters
We hebben een standaardparameteralias -lp gemaakt voor alle ingebouwde PowerShell-cmdlets die een -LiteralPath parameter hebben.
Oplossing Get-Item -LiteralPath a*b als er niet daadwerkelijk bestaat om een fout te a*b retourneren
Voorheen zou een jokerteken op dezelfde manier worden behandeld als en als het jokerteken geen bestanden zou vinden, zou het op de stille -LiteralPath -Path manier worden afgesloten. Het juiste gedrag moet letterlijk zijn, dus als het bestand niet -LiteralPath bestaat, moet er een fout worden weergegeven. Wijziging is het behandelen van jokertekens die worden gebruikt -Literal met als letterlijke.
De werkmap instellen op huidige map in Start-Job
De Start-Job cmdlet gebruikt nu de huidige map als de werkmap voor de nieuwe taak.
Verwijderen -Protocol uit *-Computer cmdlets
Vanwege problemen met RPC-remoting in CoreFX (met name op niet-Windows-platforms) en het garanderen van een consistente ervaring voor remoting in PowerShell, is de parameter verwijderd uit de -Protocol \*-Computer cmdlets. DCOM wordt niet meer ondersteund voor remoting. De volgende cmdlets bieden alleen ondersteuning voor WSMAN-remoting:
Rename-ComputerRestart-ComputerStop-Computer
Verwijderen -ComputerName uit *-Service cmdlets
Om het consistente gebruik van PSRP te stimuleren, is -ComputerName de parameter verwijderd uit *-Service cmdlets.
Oplossing Get-Content -Delimiter om het scheidingsteken niet op te nemen in de geretourneerde regels
Voorheen was de uitvoer tijdens het gebruik inconsistent en onhandig, omdat er verdere verwerking van de gegevens nodig was om het Get-Content -Delimiter scheidingsteken te verwijderen. Met deze wijziging wordt het scheidingsteken in geretourneerde regels verwijderd.
Wijzigingen in Format-Hex
De -Raw parameter is nu een 'no-op' (omdat er niets gebeurt). In de toekomst wordt alle uitvoer weergegeven met een werkelijke weergave van getallen die alle bytes voor het type bevat. Dit is wat de -Raw parameter deed vóór deze wijziging.
Typfout opgelost in Get-ComputerInfo eigenschapsnaam
BiosSerialNumber is verkeerd gespeld als BiosSeralNumber en is gewijzigd in de juiste spelling.
Get-StringHashCmdlets en Get-FileHash toevoegen
Deze wijziging is dat sommige hash-algoritmen niet worden ondersteund door CoreFX en daarom niet meer beschikbaar zijn:
MACTripleDESRIPEMD160
Validatie toevoegen aan Get-* cmdlets waarbij doorgifte $null alle objecten retourneert in plaats van fout
Als $null u door geeft aan een van de volgende wordt nu een foutmelding weergegeven:
Get-Credential -UserNameGet-Event -SourceIdentifierGet-EventSubscriber -SourceIdentifierGet-Help -NameGet-PSBreakpoint -ScriptGet-PSProvider -PSProviderGet-PSSessionConfiguration -NameGet-Runspace -NameGet-RunspaceDebug -RunspaceNameGet-Service -NameGet-TraceSource -NameGet-Variable -Name
Ondersteuning toegevoegd voor de uitgebreide W3C-logboekbestandsindeling in Import-Csv
Voorheen kan de cmdlet niet worden gebruikt voor het rechtstreeks importeren van de logboekbestanden in de uitgebreide W3C-logboekindeling en is er Import-Csv aanvullende actie vereist. Met deze wijziging wordt uitgebreide W3C-logboekindeling ondersteund.
Import-Csv is PSTypeNames van toepassing bij het importeren wanneer typegegevens aanwezig zijn in het CSV-bestand
Eerder werden de typegegevens niet bewaard door objecten die werden geëxporteerd met geïmporteerd met Export-CSV TypeInformation ConvertFrom-Csv . Met deze wijziging wordt de typegegevens toegevoegd aan PSTypeNames het lid, indien beschikbaar vanuit het CSV-bestand.
-NoTypeInformation is de standaardinstelling aan Export-Csv
Voorheen Export-CSV uitvoerde de cmdlet een opmerking als de eerste regel met de typenaam van het object. De wijziging sluit standaard de typegegevens uit omdat deze niet worden begrepen door de meeste CSV-hulpprogramma's. Deze wijziging is aangebracht om feedback van klanten aan te pakken.
Gebruik -IncludeTypeInformation om het vorige gedrag te behouden.
Toestaan * om te worden gebruikt in het registerpad voor Remove-Item
Voorheen zou een jokerteken op dezelfde manier worden behandeld als en als met het jokerteken geen bestanden werden gevonden, zou het op de stille -LiteralPath -Path manier worden afgesloten. Het juiste gedrag moet zijn dat letterlijk is, dus als het bestand niet -LiteralPath bestaat, moet het een fout veroorzaken. Wijziging is het behandelen van jokertekens die worden gebruikt -Literal met als letterlijke.
Group-Object nu de groepen sorteren
Als onderdeel van de prestatieverbetering Group-Object retourneert nu een gesorteerde lijst van de groepen.
Hoewel u niet op de volgorde moet vertrouwen, kunt u door deze wijziging worden verbroken als u de eerste groep wilt. We hebben besloten dat deze prestatieverbetering de moeite waard is omdat de impact van het afhankelijk zijn van het vorige gedrag laag is.
Standaarddeviatie in Measure-Object
De uitvoer van Measure-Object nu bevat een StandardDeviation eigenschap.
Get-Process | Measure-Object -Property CPU -AllStats
Count : 308
Average : 31.3720576298701
Sum : 9662.59375
Maximum : 4416.046875
Minimum :
StandardDeviation : 264.389544720926
Property : CPU
Get-PfxCertificate -Password
Get-PfxCertificate heeft nu de Password parameter , die een SecureString heeft. Hierdoor kunt u deze niet-interactief gebruiken:
$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '
$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint
Verwijdering van de more functie
In het verleden heeft PowerShell een functie verzonden op Windows met more de naam die verpakte more.com . Deze functie is nu verwijderd.
Bovendien is de functie gewijzigd voor gebruik op Windows of de standaard pager van het systeem die is opgegeven door op help more.com $env:PAGER niet-Windows platformen.
cd DriveName: retourneert nu gebruikers naar de huidige werkmap in dat station
Voorheen werden met of om terug te keren naar Set-Location cd een PSDrive gebruikers naar de standaardlocatie voor dat station verzonden. Gebruikers worden nu verzonden naar de laatst bekende huidige werkmap voor die sessie.
cd - retourneert naar vorige map
C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>
Of in Linux:
PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>
Wijzig cd ook in cd -- $HOME .
Update-Help als niet-beheerder
Op populaire vraag Update-Help hoeft u niet langer als beheerder te worden uitgevoerd. Update-Help wordt nu standaard ingesteld op het opslaan van help in een map binnen het gebruikersbereik.
Where-Object -Not
Met de toevoeging van de parameter aan kan een object in de pijplijn worden gefilterd op het niet-bestaan van een eigenschap of een -Not Where-Object null/lege eigenschapswaarde.
Deze opdracht retourneert bijvoorbeeld alle services waar geen afhankelijke services zijn gedefinieerd:
Get-Service | Where-Object -Not DependentServices
Wijzigingen in web-cmdlets
De onderliggende .NET API van de web-cmdlets is gewijzigd in System.Net.Http.HttpClient . Deze wijziging biedt veel voordelen. Deze wijziging heeft echter samen met een gebrek aan interoperabiliteit met Internet Explorer geleid tot verschillende belangrijke wijzigingen binnen Invoke-WebRequest en Invoke-RestMethod .
Invoke-WebRequestondersteunt nu alleen eenvoudige HTML-parsering.Invoke-WebRequestretourneert altijd eenBasicHtmlWebResponseObject-object. DeParsedHtmleigenschappen en zijnFormsverwijderd.BasicHtmlWebResponseObject.Headerswaarden zijn nuString[]in plaats vanString.BasicHtmlWebResponseObject.BaseResponseis nu eenSystem.Net.Http.HttpResponseMessage-object.- De
Responseeigenschap voor web-cmdlet-uitzonderingen is nu eenSystem.Net.Http.HttpResponseMessage-object. - Strict RFC header parsing is now default for the
-Headersand-UserAgentparameter. Dit kan worden overgeslagen met-SkipHeaderValidation. file://enftp://URI-schema's worden niet meer ondersteund.System.Net.ServicePointManager-instellingen worden niet meer gehonoreerd.- Er is momenteel geen verificatie op basis van certificaten beschikbaar in macOS.
- Gebruik van
-Credentialvia eenhttp://URI resulteert in een fout. Gebruik eenhttps://URI of gebruik de-AllowUnencryptedAuthenticationparameter om de fout te onderdrukken. -MaximumRedirectionproduceert nu een beëindigingsfout wanneer omleidingspogingen de opgegeven limiet overschrijden in plaats van de resultaten van de laatste omleiding te retourneren.- In PowerShell 6.2 is de standaardinstelling voor UTF-8-codering voor JSON-antwoorden gewijzigd. Wanneer er geen charset wordt opgegeven voor een JSON-antwoord, moet de standaardcoderen UTF-8 per RFC 8259 zijn.
- Standaardcoderen is ingesteld op UTF-8 voor
application-jsonantwoorden - Parameter toegevoegd om headers toe te
-SkipHeaderValidationstaan die niet voldoen aan deContent-Typenormen - Parameter
-Formtoegevoegd ter ondersteuning van vereenvoudigdemultipart/form-dataondersteuning - Compatibele, niet-niet-compatibele verwerking van relationele sleutels
- Parameter
-Resumetoegevoegd voor web-cmdlets
Invoke-RestMethod retourneert nuttige informatie wanneer er geen gegevens worden geretourneerd
Wanneer een API alleen retourneert, null Invoke-RestMethod werd deze geser serialiseren als de tekenreeks "null" in plaats van $null . Met deze wijziging wordt de logica in opgelost om een geldige JSON-letterlijke waarde met één waarde Invoke-RestMethod null correct te serialiseren als $null .
Web-cmdlets waarschuwen wanneer -Credential wordt verzonden via niet-versleutelde verbindingen
Wanneer u HTTP gebruikt, wordt inhoud met inbegrip van wachtwoorden als niet-tekst verzonden. Deze wijziging is om dit standaard niet toe te staan en retourneert een fout als referenties op een onveilige manier worden doorgegeven. Gebruikers kunnen dit omzeilen door de switch te -AllowUnencryptedAuthentication gebruiken.
API-wijzigingen
Klasse AddTypeCommandBase verwijderen
De AddTypeCommandBase klasse is verwijderd uit om de prestaties te Add-Type verbeteren. Deze klasse wordt alleen gebruikt door de Add-Type cmdlet en heeft geen invloed op gebruikers.
Verwijderd VisualBasic als een ondersteunde taal in Add-Type
In het verleden kon u de code Visual Basic compileren met behulp van Add-Type de cmdlet . Visual Basic is zelden gebruikt met Add-Type . We hebben deze functie verwijderd om de grootte van PowerShell te verkleinen.
Ondersteuning RunspaceConfiguration verwijderd
Voorheen kon u bij het programmatisch maken van een PowerShell-runspace met behulp van de API gebruikmaken van de verouderde RunspaceConfiguration of nieuwere InitialSessionState klassen.
Deze wijziging heeft ondersteuning voor verwijderd RunspaceConfiguration en ondersteunt alleen InitialSessionState .
CommandInvocationIntrinsics.InvokeScript argumenten binden aan $input in plaats van $args
Een onjuiste positie van een parameter heeft ertoe geleid dat de args worden doorgegeven als invoer in plaats van als args.
Eigenschappen ClrVersion en BuildVersion verwijderen uit $PSVersionTable
De ClrVersion eigenschap van is niet nuttig met $PSVersionTable CoreCLR. Eindgebruikers mogen deze waarde niet gebruiken om de compatibiliteit te bepalen.
De BuildVersion eigenschap is gekoppeld aan de Windows buildversie, die niet beschikbaar is op niet-Windows platformen. Gebruik de GitCommitId eigenschap om de exacte buildversie van PowerShell op te halen.
Unicode Escape Parsing implementeren
`u#### of `u{####} wordt geconverteerd naar het bijbehorende Unicode-teken. Als u een letterlijke uitvoer wilt `u maken, escapet u de backtick: ``u .
Probleem met parameterbinding ValueFromRemainingArguments met in PS-functies
ValueFromRemainingArguments retourneert nu de waarden als een matrix in plaats van één waarde die zelf een matrix is.
Opgeschoond gebruik van CommandTypes.Workflow en WorkflowInfoCleaned
Schoon code op die betrekking heeft op het gebruik van CommandTypes.Workflow en WorkflowInfo in System.Management.Automation.
Deze kleine belangrijke wijzigingen zijn voornamelijk van invloed op de code van de helpprovider.
- Wijzig de openbare constructors van
WorkflowInfoin intern. Werkstroom wordt niet meer ondersteund, dus het is logisch om niet toe te staan dat mensenWorkflowexemplaren maken. - Verwijder het type System.Management.Automation.DebugSource, omdat dit alleen wordt gebruikt voor foutopsporing voor werkstromen.
- Verwijder de overbelasting van
SetParentuit de abstracte klasse Debugger die alleen wordt gebruikt voor werkstroomopsporing. - Verwijder dezelfde overbelasting van
SetParentuit de afgeleide klasse RemotingJobDebugger.
Retourresultaat niet verpakken in bij PSObject het converteren van een ScriptBlock naar een gemachtigde
Wanneer een wordt geconverteerd naar een gemachtigdentype dat moet worden gebruikt in de C#-context, levert het verpakken van het resultaat ScriptBlock in een PSObject onnodige problemen op:
- Wanneer de waarde wordt geconverteerd naar het retourtype gemachtigde, wordt de in wezen
PSObjectuitschreven. DePSObjectis dus onnodig. - Wanneer het retourtype van de gemachtigde is, wordt deze verpakt in een waardoor het lastig is om met
objectPSObjectin C#-code te werken.
Na deze wijziging is het geretourneerde object het onderliggende object.
Ondersteuning voor remoting
Voor PowerShell Voor remoting (PSRP) met WinRM op Unix-platformen is NTLM/Negotiate of Basisversleuteling via HTTPS vereist. PSRP in macOS ondersteunt alleen Basis auth via HTTPS. Kerberos-verificatie wordt niet ondersteund voor niet-Windows platformen.
PowerShell biedt ook ondersteuning voor PsRP (Remoting) van PowerShell via SSH op alle platformen (Windows, macOS en Linux). Zie SSH-remoting in PowerShell voor meer informatie.
PowerShell Direct for Containers probeert eerst te pwsh gebruiken
PowerShell Direct is een functie van PowerShell en Hyper-V waarmee u verbinding kunt maken met een Hyper-V-VM of container zonder netwerkverbinding of andere services voor extern beheer.
In het verleden is PowerShell Direct verbonden met behulp van het ingebouwde Windows PowerShell-exemplaar op de container. PowerShell Direct probeert nu eerst verbinding te maken met behulp van een beschikbare pwsh.exe in de PATH omgevingsvariabele. Als pwsh.exe niet beschikbaar is, valt PowerShell Direct terug om te powershell.exe gebruiken.
Enable-PSRemoting maakt nu afzonderlijke eindpunten voor remoting voor preview-versies
Enable-PSRemoting maakt nu twee sessieconfiguraties voor extern bureaublad:
- Een voor de belangrijkste versie van PowerShell. Bijvoorbeeld
PowerShell.6. Dit eindpunt kan worden gebruikt voor kleine versie-updates als de 'systeembrede' PowerShell 6-sessieconfiguratie - Eén versiespecifieke sessieconfiguratie, bijvoorbeeld:
PowerShell.6.1.0
Dit gedrag is handig als u meerdere PowerShell 6-versies wilt installeren en toegankelijk wilt maken op dezelfde computer.
Daarnaast krijgen preview-versies van PowerShell nu hun eigen remoting-sessieconfiguraties na het uitvoeren van de Enable-PSRemoting cmdlet:
C:\WINDOWS\system32> Enable-PSRemoting
De uitvoer kan anders zijn als u WinRM nog niet eerder hebt ingesteld.
WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.
Vervolgens ziet u afzonderlijke PowerShell-sessieconfiguraties voor de preview en stabiele builds van PowerShell 6 en voor elke specifieke versie.
Get-PSSessionConfiguration
Name : PowerShell.6.2-preview.1
PSVersion : 6.2
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : PowerShell.6-preview
PSVersion : 6.2
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : powershell.6
PSVersion : 6.1
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : powershell.6.1.0
PSVersion : 6.1
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
user@host:port syntaxis die wordt ondersteund voor SSH
SSH-clients ondersteunen doorgaans een connection string in de indeling user@host:port . Met de toevoeging van SSH als een protocol voor remoting van PowerShell hebben we ondersteuning toegevoegd voor deze indeling van connection string:
Enter-PSSession -HostName fooUser@ssh.contoso.com:2222
Telemetrie kan alleen worden uitgeschakeld met een omgevingsvariabele
PowerShell verzendt eenvoudige telemetriegegevens naar Microsoft wanneer deze worden gestart. De gegevens omvatten de naam van het besturingssysteem, de versie van het besturingssysteem en de PowerShell-versie. Met deze gegevens kunnen we beter inzicht krijgen in de omgevingen waarin PowerShell wordt gebruikt en kunnen we prioriteit geven aan nieuwe functies en oplossingen.
Als u zich wilt af melden voor deze telemetrie, stelt u de omgevingsvariabele POWERSHELL_TELEMETRY_OPTOUT in op , of true yes 1 . Het verwijderen van het bestand om telemetrie uit te schakelen wordt DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY niet meer ondersteund.