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-PSSnapin
  • Export-Console
  • Get-PSSnapin
  • Remove-PSSnapin
  • Resume-Job
  • Suspend-Job

Microsoft.PowerShell.Diagnostics

  • Export-Counter
  • Import-Counter

Microsoft.PowerShell.Management

  • Add-Computer
  • Checkpoint-Computer
  • Clear-EventLog
  • Complete-Transaction
  • Disable-ComputerRestore
  • Enable-ComputerRestore
  • Get-ComputerRestorePoint
  • Get-ControlPanelItem
  • Get-EventLog
  • Get-Transaction
  • Get-WmiObject
  • Invoke-WmiMethod
  • Limit-EventLog
  • New-EventLog
  • New-WebServiceProxy
  • Register-WmiEvent
  • Remove-Computer
  • Remove-EventLog
  • Remove-WmiObject
  • Reset-ComputerMachinePassword
  • Restore-Computer
  • Set-WmiInstance
  • Show-ControlPanelItem
  • Show-EventLog
  • Start-Transaction
  • Test-ComputerSecureChannel
  • Undo-Transaction
  • Use-Transaction
  • Write-EventLog

Microsoft.PowerShell.Utility

  • Convert-String
  • ConvertFrom-String

PSDesiredStateConfiguration

  • Disable-DscDebug
  • Enable-DscDebug
  • Get-DscConfiguration
  • Get-DscConfigurationStatus
  • Get-DscLocalConfigurationManager
  • Publish-DscConfiguration
  • Remove-DscConfigurationDocument
  • Restore-DscConfiguration
  • Set-DscLocalConfigurationManager
  • Start-DscConfiguration
  • Stop-DscConfiguration
  • Test-DscConfiguration
  • Update-DscConfiguration

WMI v1-cmdlets

De volgende WMI v1-cmdlets zijn verwijderd uit PowerShell:

  • Register-WmiEvent
  • Set-WmiInstance
  • Invoke-WmiMethod
  • Get-WmiObject
  • Remove-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-Transaction
  • Get-Transaction
  • Start-Transaction
  • Undo-Transaction
  • Use-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-Command cmdlet
  • De Out-GridView cmdlet
  • 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 -Command in -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 kunt pwsh foo.ps1 uitvoeren zonder op te pwsh fooScript -File geven. Voor deze wijziging moet u echter expliciet opgeven of -c wanneer u opdrachten zoals probeert uit te -Command pwsh.exe -Command Get-Command voeren.
  • pwsh accepteert de -i schakelknop (of -Interactive ) om een interactieve shell aan te geven. Hierdoor kan PowerShell worden gebruikt als een standaardshell op Unix-platforms.
  • Parameters en -ImportSystemModules verwijderd -PSConsoleFile uit pwsh.exe .
  • De pwsh -version en ingebouwde help voor is pwsh.exe gewijzigd in overeenstemming met andere native hulpprogramma's.
  • Ongeldige argumentfoutberichten voor -File en -Command en exit-codes die consistent zijn met Unix-standaarden
  • Parameter -WindowStyle toegevoegd 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-Computer
  • Restart-Computer
  • Stop-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:

  • MACTripleDES
  • RIPEMD160

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 -UserName
  • Get-Event -SourceIdentifier
  • Get-EventSubscriber -SourceIdentifier
  • Get-Help -Name
  • Get-PSBreakpoint -Script
  • Get-PSProvider -PSProvider
  • Get-PSSessionConfiguration -Name
  • Get-Runspace -Name
  • Get-RunspaceDebug -RunspaceName
  • Get-Service -Name
  • Get-TraceSource -Name
  • Get-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-WebRequest ondersteunt nu alleen eenvoudige HTML-parsering. Invoke-WebRequest retourneert altijd een BasicHtmlWebResponseObject -object. De ParsedHtml eigenschappen en zijn Forms verwijderd.
  • BasicHtmlWebResponseObject.Headers waarden zijn nu String[] in plaats van String .
  • BasicHtmlWebResponseObject.BaseResponse is nu een System.Net.Http.HttpResponseMessage -object.
  • De Response eigenschap voor web-cmdlet-uitzonderingen is nu een System.Net.Http.HttpResponseMessage -object.
  • Strict RFC header parsing is now default for the -Headers and -UserAgent parameter. Dit kan worden overgeslagen met -SkipHeaderValidation .
  • file:// en ftp:// 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 -Credential via een http:// URI resulteert in een fout. Gebruik een https:// URI of gebruik de -AllowUnencryptedAuthentication parameter om de fout te onderdrukken.
  • -MaximumRedirection produceert 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-json antwoorden
  • Parameter toegevoegd om headers toe te -SkipHeaderValidation staan die niet voldoen aan de Content-Type normen
  • Parameter -Form toegevoegd ter ondersteuning van vereenvoudigde multipart/form-data ondersteuning
  • Compatibele, niet-niet-compatibele verwerking van relationele sleutels
  • Parameter -Resume toegevoegd 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 WorkflowInfo in intern. Werkstroom wordt niet meer ondersteund, dus het is logisch om niet toe te staan dat mensen Workflow exemplaren maken.
  • Verwijder het type System.Management.Automation.DebugSource, omdat dit alleen wordt gebruikt voor foutopsporing voor werkstromen.
  • Verwijder de overbelasting van SetParent uit de abstracte klasse Debugger die alleen wordt gebruikt voor werkstroomopsporing.
  • Verwijder dezelfde overbelasting van SetParent uit 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 PSObject uitschreven. De PSObject is dus onnodig.
  • Wanneer het retourtype van de gemachtigde is, wordt deze verpakt in een waardoor het lastig is om met object PSObject in 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.