Skillnader mellan Windows PowerShell 5.1 och PowerShell 7.x

Windows PowerShell 5.1 bygger på .NET Framework v4.5. Med powershell-versionen 6.0 blev PowerShell ett projekt med öppen källkod som bygger på .NET Core 2.0. PowerShell 7.0 bygger på .NET Core 3.1. Och med versionen av PowerShell 7.2 kommer PowerShell att byggas på .NET 6.0. Genom att flytta från .NET Framework till .NET Core kunde PowerShell bli en plattformsoberoende lösning. PowerShell körs på Windows, macOS och Linux.

Det finns några skillnader i PowerShell-språket mellan Windows PowerShell och PowerShell. Skillnaderna är mest viktiga vad gäller tillgänglighet och beteende för PowerShell-cmdlets mellan Windows- och icke-Windows-plattformar och de ändringar som beror på skillnaderna mellan .NET Framework och .NET Core.

Den här artikeln sammanfattar de betydande skillnaderna och de större ändringarna mellan Windows PowerShell och den aktuella versionen av PowerShell. Den här sammanfattningen innehåller inte nya funktioner eller cmdlets som har lagts till. Den här artikeln beskriver inte heller vad som har ändrats mellan olika versioner. Målet med den här artikeln är att presentera det aktuella tillståndet för PowerShell och hur det skiljer sig från Windows PowerShell. En detaljerad beskrivning av ändringar mellan versioner och tillägg av nya funktioner finns i artiklarna What's New (Vad är nytt) för varje version.

.NET Framework jämfört med .NET Core

PowerShell på Linux och macOS använder .NET Core, som är en delmängd av den fullständiga .NET Framework på Microsoft Windows. Detta är viktigt eftersom PowerShell ger direkt åtkomst till de underliggande ramverkstyperna och metoderna. Därför kan skript som körs på Windows inte köras på icke-Windows på grund av skillnaderna i ramverken. Mer information om ändringar i .NET Core finns i Breaking changes for migration from .NET Framework to .NET Core (Större ändringar för migrering från .NET Framework till .NET Core).

Med .NET Standard 2.0 kanPowerShell läsa in många traditionella moduler Windows PowerShell utan ändringar. Dessutom innehåller PowerShell 7 en Windows PowerShell-kompatibilitetsfunktion som gör att du kan använda Windows PowerShell-moduler som fortfarande kräver det fullständiga ramverket.

Mer information finns i:

Produktterminologi som används i dokumentationen

Dokumentationen för PowerShell består av två typer av innehåll: cmdlet-referens och konceptuellt innehåll. Cmdlet-referensen är versionsspecifik. Du kan växla versioner från den nedrullningsna menyn längst upp till vänster på sidan. Konceptuellt innehåll ändras inte när du ändrar versioner. I allmänhet gäller begreppen för alla versioner av PowerShell, såvida inte en specifik version beskrivs i artikeln.

  • PowerShell – Det här är standardnamnet som vi använder för produkten. När vi använder det här namnet i dokumentationen pratar vi om den aktuella versionen av PowerShell. Skillnader mellan PowerShell och Windows PowerShell anges genom att notera den specifika versionen.
  • Windows PowerShell – PowerShell bygger på .NET Framework. Windows PowerShell levereras endast på Windows och kräver det fullständiga ramverket. Det går att köra både PowerShell och Windows PowerShell på samma Windows dator.

Moduler levereras inte längre med PowerShell

Av olika kompatibilitetsskäl ingår inte längre följande moduler i PowerShell.

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

PowerShell-arbetsflöde

PowerShell Workflow är en funktion i Windows PowerShell som bygger på Windows Workflow Foundation (WF) som gör det möjligt att skapa robusta runbooks för långvariga eller parallelliserade uppgifter.

På grund av bristen på stöd för Windows Workflow Foundation i .NET Core har vi tagit bort PowerShell Workflow från PowerShell.

I framtiden vill vi aktivera intern parallellitet/samtidighet på PowerShell-språket utan att behöva PowerShell Workflow.

Om du behöver använda kontrollpunkter för att återuppta ett skript efter att operativsystemet har startats om rekommenderar vi att du använder Schemaläggaren för att köra ett skript vid start av operativsystemet, men skriptet måste behålla sitt eget tillstånd (t.ex. att spara det i en fil).

Cmdlets har tagits bort från PowerShell

För de moduler som ingår i PowerShell har följande cmdlets tagits bort från PowerShell av olika kompatibilitetsskäl eller användningen av API:er som inte stöds.

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

Följande WMI v1-cmdlets har tagits bort från PowerShell:

  • Register-WmiEvent
  • Set-WmiInstance
  • Invoke-WmiMethod
  • Get-WmiObject
  • Remove-WmiObject

Cmdletarna för CimCmdlets-modulen (även kallat WMI v2) utför samma funktion och tillhandahåller nya funktioner och en omdesignad syntax.

New-WebServiceProxy cmdlet borttagen

.NET Core stöder inte Windows Communication Framework, som tillhandahåller tjänster för användning av SOAP-protokollet. Den här cmdleten har tagits bort eftersom den kräver SOAP.

*-Transaction cmdlets har tagits bort

Dessa cmdlets hade mycket begränsad användning. Beslutet togs om att upphöra med stödet för dem.

  • Complete-Transaction
  • Get-Transaction
  • Start-Transaction
  • Undo-Transaction
  • Use-Transaction

*-EventLog Cmdlets

På grund av användningen av API:er som inte stöds har *-EventLog cmdletarna tagits bort från PowerShell. Get-WinEventoch New-WinEvent är tillgängliga för att hämta och skapa händelser Windows.

Cmdlets som använder Windows Presentation Framework (WPF)

.NET Core 3.1 har lagt till stöd för WPF, så lanseringen av PowerShell 7.0 återställde följande Windows specifika funktioner:

  • Show-CommandCmdleten
  • Out-GridViewCmdleten
  • Parametern ShowWindow för Get-Help

Ändringar i PowerShell Desired State Configuration (DSC)

Invoke-DscResource återställdes som en experimentell funktion i PowerShell 7.0.

Från och med PowerShell 7.2 har PSDesiredStateConfiguration-modulen tagits bort från PowerShell och har publicerats till PowerShell-galleriet. Mer information finns i tillkännagivandet i PowerShell-teamets blogg.

Motor-/språkändringar

powershell.exe har bytt namn till pwsh.exe

Binärnamnet för PowerShell har ändrats från powershell(.exe) till pwsh(.exe) . Den här ändringen är ett deterministiskt sätt för användare att köra PowerShell på datorer och stödja sida-vid-sida-installationer av Windows PowerShell och PowerShell.

Ytterligare ändringar i pwsh(.exe) från powershell.exe :

  • Ändrade den första positionsparametern från -Command till -File . Den här ändringen åtgärdar användningen av (även kallat shegie) i PowerShell-skript som körs från andra gränssnitt än #! PowerShell-gränssnitt på Windows plattformar. Det innebär också att du kan köra kommandon som pwsh foo.ps1 eller utan att ange pwsh fooScript -File . Den här ändringen kräver dock att du uttryckligen anger -c eller när du försöker köra kommandon som -Command pwsh.exe -Command Get-Command .
  • pwsh accepterar växeln -i (eller -Interactive ) för att ange ett interaktivt gränssnitt. Detta gör att PowerShell kan användas som ett standardgränssnitt på Unix-plattformar.
  • Parametrarna -ImportSystemModules och har tagits bort från -PSConsoleFile pwsh.exe .
  • Ändrad pwsh -version och inbyggd hjälp för att anpassas till andra pwsh.exe inbyggda verktyg.
  • Ogiltiga argumentfelmeddelanden för -File och -Command slutkoder som är konsekventa med Unix-standarder
  • Parametern -WindowStyle har lagts till Windows. På samma sätt är paketbaserade installationsuppdateringar på Windows på plats-uppdateringar.

Det förkortade namnet är också konsekvent med namngivning av gränssnitt på icke-Windows plattformar.

Stöd för att köra ett PowerShell-skript med bool-parameter

Tidigare använde för pwsh.exe att köra ett PowerShell-skript med hjälp -File av inget sätt att skicka som $true / $false parametervärden. Stöd för $true / $false parsade värden till parametrar har lagts till. Växelvärden stöds också.

Stöd för PowerShell som unix-standardgränssnitt

I Unix är det en konvention för gränssnitt att godkänna för ett interaktivt gränssnitt och många verktyg förväntar sig det här beteendet ( till exempel och när du anger PowerShell som standardgränssnitt) och anropar gränssnittet med -i script -i växeln. Den här ändringen går inte att ändra eftersom tidigare kan användas som en kort hand för att matcha -i , som nu måste vara -inputformat -in .

Anpassade snapin-modulen

PowerShell-snapin-moduler är en föregångare till PowerShell-moduler som inte har en omfattande implementering i PowerShell-communityn.

På grund av komplexiteten med att stödja snapin-modulen och deras brist på användning i communityn stöder vi inte längre anpassade snapin-modulen i PowerShell.

Experimentella funktionsflaggor

Vi har aktiverat stöd för experimentella funktioner. På så sätt kan PowerShell-utvecklare leverera nya funktioner och få feedback innan designen är klar. På så sätt undviker vi att göra större ändringar när designen utvecklas.

Använd Get-ExperimentalFeature för att hämta en lista över tillgängliga experimentella funktioner. Du kan aktivera eller inaktivera dessa funktioner med Enable-ExperimentalFeature och Disable-ExperimentalFeature .

Läsa in sammansättningen från modulens bassökväg innan du försöker läsa in från GAC

Tidigare, när en binär modul har modulsammansättningen i GAC, läser vi in sammansättningen från GAC innan vi försöker läsa in den från modulens bassökväg.

Hoppa över null-elementkontroll för samlingar med elementtypen value-type

För Mandatory parametern ValidateNotNull och ValidateNotNullOrEmpty attributen hoppar du över kontrollen av null-element om samlingens elementtyp är värdetyp.

Preserve $? för ParenExpression, SubExpression och ArrayExpression

Den här PR:en ändrar hur vi kompilerar underpipelines , underuttryck och matrisuttryck så (...) att det inte är automatiskt $(...) @() $? sant. Värdet för beror $? i stället på resultatet av pipelinen eller de instruktioner som körs.

Korrigering $? till att inte vara när det $false inbyggda kommandot skriver till stderr

$? är inte inställt på $false när det interna kommandot skriver till stderr . Det är vanligt att interna kommandon skriver till stderr utan att ange ett fel. $? är inställt $false på endast när det interna kommandot har en slutkod som inte är noll.

Påverka $ErrorActionPreference inte stderr utdata från interna kommandon

Det är vanligt att interna kommandon skriver till stderr utan att ange ett fel. Med den här ändringen avbildas utdata fortfarande i ErrorRecord-objekt, men körningen gäller inte längre om stderr $ErrorActionPreference ErrorRecord kommer från ett inbyggt kommando.

Ändra $OutputEncoding till att använda UTF-8 NoBOM kodning i stället för ASCII

Den tidigare kodningen, ASCII (7-bitars), skulle i vissa fall resultera i en felaktig ändring av utdata. Om UTF-8 NoBOM du gör det bevarar du Unicode-utdata med kodning som stöds av de flesta verktyg och operativsystem.

Förena cmdlets med parameter -Encoding som ska vara av typen System.Text.Encoding

Värdet -Encoding har tagits bort från Byte cmdletarna för filsystemsprovidern. En ny parameter, , används nu för att ange att en byteström krävs som indata eller att -AsByteStream utdata är en dataström med byte.

Ändra New-ModuleManifest kodning UTF8NoBOM till på icke-Windows plattformar

Skapar tidigare New-ModuleManifest psd1 manifest i UTF-16 med BOM, vilket skapar ett problem för Linux-verktyg. Den här icke-Windows ändringen ändrar kodningen till New-ModuleManifest UTF (ingen BOM).

Ta AllScope bort från de flesta standardalias

För att påskynda omfångsskapandet AllScope har tagits bort från de flesta standardalias. AllScope kvar för några alias som används ofta där sökning var snabbare.

-Verbose och -Debug åsidosätter inte längre $ErrorActionPreference

Tidigare, -Verbose om -Debug eller angavs, överspelade den beteendet för $ErrorActionPreference . Med den här ändringen -Verbose och påverkar inte längre -Debug beteendet för $ErrorActionPreference .

Dessutom anges -Debug parametern $DebugPreference till Fortsätt i stället för Fråga.

Göra $PSCulture konsekventa kulturändringar under sessionen

I Windows PowerShell cachelagras det aktuella kulturvärdet, vilket kan göra att värdet inte synkroniseras med kulturen ändras efter sessionsstart. Det här cachelagringsbeteendet har åtgärdats i PowerShell-kärnan.

Tillåt att uttryckligen angivna namngivna parametrar ersätter samma från hashtable-splatting

Med den här ändringen flyttas de namngivna parametrarna från splattingen till slutet av parameterlistan så att de binds när alla uttryckligen angivna namngivna parametrar har binds. Parameterbindningen för enkla funktioner kastar inte ett fel när det inte går att hitta en angiven namngiven parameter. Okända namngivna parametrar är bundna till $args parametern för den enkla funktionen. Om du flyttar splatting till slutet av argumentlistan ändras ordningen som parametrarna visas i $args .

Exempel:

function SimpleTest {
    param(
        $Name,
        $Path
    )
    "Name: $Name; Path: $Path; Args: $args"
}

I det tidigare beteendet är MyPath inte bundet -Path till eftersom det är det tredje argumentet i argumentlistan. ## Så det blir instoppat i "$args" tillsammans med Blah = "World"

PS> $hash = @{ Name = "Hello"; Blah = "World" }
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: ; Args: -Blah: World MyPath

Med den här ändringen flyttas @hash argumenten från till slutet av argumentlistan. MyPath blir det första argumentet i listan, så det är bundet till -Path .

PS> SimpleTest @hash "MyPath"
Name: Hello; Path: MyPath; Args: -Blah: World

Operatorn & för jobbkontroll har lagts till

När & du sätter i slutet av en pipeline körs pipelinen som ett PowerShell-jobb. När en pipeline har bakgrundsbakgrund returneras ett jobbobjekt. När pipelinen körs som ett jobb kan alla *-Job standard-cmdlets användas för att hantera jobbet. Variabler (som ignorerar processspecifika variabler) som används i pipelinen kopieras automatiskt till jobbet, så Copy-Item $foo $bar & det fungerar bara. Jobbet körs också i den aktuella katalogen i stället för användarens arbetskatalog.

Nya metoder/egenskaper på PSCustomObject

Vi har lagt till nya metoder och egenskaper i PSCustomObject . PSCustomObjectinnehåller nu en Count / Length egenskap som andra objekt.

$PSCustomObject = [pscustomobject]@{foo = 1}

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Det här arbetet omfattar ForEach även Where - och -metoder som gör att du kan använda och filtrera på PSCustomObject objekt:

$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
  1

Konverteringar från PSMethod till Delegate

Du kan konvertera en PSMethod till en delegat. På så sätt kan du till exempel skicka PSMethod [M]::DoubleStrLen som ett delegatvärde till [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)

Ändringar i cmdleten

Sök system32 efter kompatibla inbyggda moduler på Windows

I Windows 10 1809-uppdateringen och Windows Server 2019 uppdaterade vi ett antal inbyggda PowerShell-moduler för att markera dem som kompatibla med PowerShell.

När PowerShell startar ingår det automatiskt som $windir\System32 en del av PSModulePath miljövariabeln. Den exponerar dock endast moduler för och Get-Module om de är markerade som Import-Module CompatiblePSEdition kompatibla med Core .

Du kan åsidosätta det här beteendet om du vill visa alla moduler med hjälp av -SkipEditionCheck växlingsparametern. Vi har också lagt till en PSEdition egenskap i tabellutdata.

-lp alias för alla -LiteralPath parametrar

Vi har skapat ett -lp standardparameteralias för alla inbyggda PowerShell-cmdlets som har en -LiteralPath parameter.

Åtgärda Get-Item -LiteralPath a*b om inte finns för att returnera a*b fel

Tidigare skulle ett jokertecken behandla det på samma sätt som och om jokertecknet inte hittade några filer -LiteralPath -Path skulle det avslutas tyst. Rätt beteende bör vara -LiteralPath som är literalt, så om filen inte finns bör den ha ett fel. Ändringen är att behandla jokertecken som används med -Literal som literaler.

Ange arbetskatalog till aktuell katalog i Start-Job

Start-JobCmdleten använder nu den aktuella katalogen som arbetskatalog för det nya jobbet.

Ta -Protocol bort *-Computer från cmdlets

På grund av problem med RPC-fjärrkommunikation i CoreFX (särskilt på icke-Windows-plattformar) och säkerställa en konsekvent fjärrkommunikation i PowerShell, har parametern tagits bort från -Protocol \*-Computer cmdletarna. DCOM stöds inte längre för fjärrkommunikation. Följande cmdlets stöder endast WSMAN-fjärrkommunikation:

  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

Ta -ComputerName bort *-Service från cmdlets

Parametern togs bort från cmdletarna för att uppmuntra konsekvent -ComputerName användning *-Service av PSRP.

Korrigering Get-Content -Delimiter för att inte inkludera avgränsaren i de returnerade raderna

Tidigare var utdata vid användning inkonsekventa och inkonsekventa eftersom det krävde ytterligare bearbetning av Get-Content -Delimiter data för att ta bort avgränsaren. Den här ändringen tar bort avgränsaren i returnerade rader.

Ändringar i Format-Hex

Parametern -Raw är nu en "no-op" (på så sätt att den inte gör någonting). Framöver visas alla utdata med en sann representation av tal som innehåller alla byte för dess typ. Det här är vad -Raw parametern gjorde innan den här ändringen.

Skrivfelskorrigering i Get-ComputerInfo egenskapsnamn

BiosSerialNumber har stavats fel BiosSeralNumber som och har ändrats till rätt stavning.

Lägg Get-StringHash till Get-FileHash cmdletarna och

Den här ändringen innebär att vissa hash-algoritmer inte stöds av CoreFX, och därför är de inte längre tillgängliga:

  • MACTripleDES
  • RIPEMD160

Lägg till validering på Get-* cmdlets där $null returnerar alla objekt i stället för fel

Om $null du går vidare till något av följande får du nu ett felmeddelande:

  • 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

Lägg till stöd för det utökade loggfilsformatet för W3C i Import-Csv

Tidigare kan cmdleten inte användas för att importera loggfilerna direkt i Import-Csv utökat loggformat i W3C och ytterligare åtgärder skulle krävas. Med den här ändringen stöds utökat loggformat för W3C.

Import-Csv gäller PSTypeNames vid import när typinformation finns i CSV-filen

Tidigare behåller objekt som Export-CSV exporterades TypeInformation med importerade med ConvertFrom-Csv inte typinformationen. Den här ändringen lägger till typinformationen till PSTypeNames medlemmen om den är tillgänglig från CSV-filen.

-NoTypeInformation är standard på Export-Csv

Tidigare skulle Export-CSV cmdleten mata ut en kommentar som den första raden som innehåller typnamnet för objektet. Ändringen exkluderar typinformationen som standard eftersom den inte tolkas av de flesta CSV-verktyg. Den här ändringen har gjorts för att hantera kundfeedback.

Använd -IncludeTypeInformation för att behålla det tidigare beteendet.

Tillåt * att användas i registersökvägen för Remove-Item

Tidigare skulle ett jokertecken behandla det på samma sätt som och om jokertecknet inte hittade några filer -LiteralPath -Path skulle det avslutas tyst. Rätt beteende bör vara -LiteralPath som är literalt, så om filen inte finns bör den ha ett fel. Ändringen är att behandla jokertecken som används med -Literal som literaler.

Group-Object sorterar nu grupperna

Som en del av prestandaförbättringen Group-Object returnerar nu en sorterad lista över grupperna. Även om du inte bör förlita dig på ordern kan du brytas av den här ändringen om du vill ha den första gruppen. Vi kom fram till att den här prestandaförbättringen var värd ändringen eftersom effekten av att vara beroende av tidigare beteende är låg.

Standardavvikelse i Measure-Object

Utdata från Measure-Object innehåller nu en StandardDeviation -egenskap.

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 har nu Password parametern , som tar en SecureString . På så sätt kan du använda den icke-interaktivt:

$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '

$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint

Borttagning av more funktionen

Tidigare levererade PowerShell en funktion på en Windows kallade more den omsluten more.com . Den funktionen har nu tagits bort.

Dessutom har funktionen ändrats så att den Windows på datorn eller systemets standard pager som anges av help more.com$env:PAGER icke-Windows plattformar.

cd DriveName: returnerar nu användare till den aktuella arbetskatalogen på den enheten

Tidigare använde eller Set-Location för att återgå till en cd PSDrive skickade användarna till standardplatsen för den enheten. Användare skickas nu till den senaste kända aktuella arbetskatalogen för den sessionen.

cd - återgår till föregående katalog

C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>

Eller i Linux:

PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>

Och ändra cd cd -- till $HOME .

Update-Help som icke-administratör

Av populär efterfrågan Update-Help behöver inte längre köras som administratör. Update-Help sparar nu hjälpen till en mapp med användaromfång som standard.

Where-Object -Not

Med tillägget av parametern till kan filtrera ett objekt i pipelinen för att se om en egenskap inte finns, eller -Not Where-Object ett null-/tomt egenskapsvärde.

Det här kommandot returnerar till exempel alla tjänster som inte har några beroende tjänster definierade:

Get-Service | Where-Object -Not DependentServices

Ändringar i webb-cmdlets

Det underliggande .NET-API:et för webb-cmdletarna har ändrats till System.Net.Http.HttpClient . Den här ändringen ger många fördelar. Men den här ändringen tillsammans med bristande samverkan med Internet Explorer har lett till flera större ändringar inom Invoke-WebRequest och Invoke-RestMethod .

  • Invoke-WebRequest stöder nu endast grundläggande HTML-parsning. Invoke-WebRequest returnerar alltid ett BasicHtmlWebResponseObject -objekt. Egenskaperna ParsedHtml och har tagits Forms bort.
  • BasicHtmlWebResponseObject.Headers -värdena är nu String[] i stället för String .
  • BasicHtmlWebResponseObject.BaseResponse är nu ett System.Net.Http.HttpResponseMessage -objekt.
  • Egenskapen Response för Web Cmdlet-undantag är nu ett System.Net.Http.HttpResponseMessage -objekt.
  • Strikt RFC-rubrikparsning är nu standard för -Headers -UserAgent parametern och . Detta kan kringgås med -SkipHeaderValidation .
  • file:// och ftp:// URI-scheman stöds inte längre.
  • System.Net.ServicePointManager -inställningarna respekteras inte längre.
  • Det finns för närvarande ingen certifikatbaserad autentisering i macOS.
  • Användning av -Credential över en http:// URI resulterar i ett fel. Använd en https:// URI eller ange -AllowUnencryptedAuthentication parametern för att förhindra felet.
  • -MaximumRedirection genererar nu ett avslutande fel när omdirigeringsförsök överskrider den angivna gränsen i stället för att returnera resultatet av den senaste omdirigeringen.
  • I PowerShell 6.2 gjordes en ändring av standardvärdet till UTF-8-kodning för JSON-svar. Om en teckenuppsättning inte anges för ett JSON-svar ska standardkodningen vara UTF-8 per RFC 8259.
  • Standardkodning inställd på UTF-8 för application-json svar
  • Parametern -SkipHeaderValidation har lagts till för att tillåta Content-Type huvuden som inte är standardkompatibla
  • Parametern -Form har lagts till för att stödja förenklat multipart/form-data stöd
  • Kompatibel, icke-känslig hantering av relationsnycklar
  • Parametern -Resume har lagts till för webb-cmdlets

Invoke-RestMethod returnerar användbar information när inga data returneras

När ett API returnerar null bara , Invoke-RestMethod serialiserades detta som strängen "null" i stället för $null . Den här ändringen åtgärdar logiken i Invoke-RestMethod för att korrekt serialisera en giltig JSON-literal null med ett enda värde som $null .

Webb-cmdlets varnar -Credential när skickas via okrypterade anslutningar

När du använder HTTP skickas innehåll, inklusive lösenord, som klartext. Den här ändringen är att inte tillåta detta som standard och returnera ett fel om autentiseringsuppgifterna skickas på ett osäkert sätt. Användare kan kringgå detta med hjälp av -AllowUnencryptedAuthentication växeln .

API-ändringar

Ta bort AddTypeCommandBase klass

Klassen AddTypeCommandBase har tagits bort från för att förbättra Add-Type prestandan. Den här klassen används bara av Add-Type cmdleten och bör inte påverka användarna.

Tas VisualBasic bort som ett språk som stöds i Add-Type

Tidigare kunde du kompilera Visual Basic med hjälp av Add-Type cmdleten . Visual Basic användes sällan med Add-Type . Vi har tagit bort den här funktionen för att minska storleken på PowerShell.

Stöd har tagits RunspaceConfiguration bort

När du tidigare skapade ett PowerShell-runspace programmatiskt med hjälp av API:et kunde du använda de äldre RunspaceConfiguration eller nyare InitialSessionState klasserna. Den här ändringen tog bort stödet RunspaceConfiguration för och stöder endast InitialSessionState .

CommandInvocationIntrinsics.InvokeScript binda argument till i $input stället för $args

En felaktig position för en parameter resulterade i att args skickades som indata i stället för som args.

Ta ClrVersion bort egenskaperna och BuildVersion från $PSVersionTable

Egenskapen ClrVersion för är inte användbar med $PSVersionTable CoreCLR. Slutanvändarna bör inte använda det värdet för att fastställa kompatibiliteten.

Egenskapen BuildVersion var kopplad till Windows version, som inte är tillgänglig på icke-Windows plattformar. Använd egenskapen GitCommitId för att hämta den exakta versionen av PowerShell.

Implementera Unicode-escape-parsning

`u#### eller `u{####} konverteras till motsvarande Unicode-tecken. Om du vill mata ut en `u literal, så undvik backticken: ``u .

Parameterbindningsproblem med ValueFromRemainingArguments i PS-funktioner

ValueFromRemainingArguments returnerar nu värdena som en matris i stället för ett enda värde som i sig är en matris.

Rensad användning av CommandTypes.Workflow och WorkflowInfoCleaned

Rensa kod som rör användning av CommandTypes.Workflow och WorkflowInfo i System.Management.Automation.

Dessa mindre större ändringar påverkar främst hjälpleverantörskoden.

  • Ändra de offentliga konstruktorerna WorkflowInfo för till interna. Vi stöder inte arbetsflöde längre, så det är klokt att inte tillåta att personer Workflow skapar instanser.
  • Ta bort typen System.Management.Automation.DebugSource eftersom den endast används för felsökning av arbetsflöden.
  • Ta bort SetParent överlagringen av från den abstrakta klassen Debugger som endast används för felsökning av arbetsflöden.
  • Ta bort samma överlagring SetParent från den härledda klassen RemotingJobDebugger.

Omslut inte returresultatet när PSObject du konverterar en ScriptBlock till en delegat

När en konverteras till en delegattyp som ska användas i C#-kontexten medför omslutningen av resultatet att det inte finns några ScriptBlock PSObject problem:

  • När värdet konverteras till delegatreturtypen, PSObject packas i stort sett upp. Så PSObject den är inte behöver.
  • När delegatreturtypen object är , omsluts den i en PSObject vilket gör det svårt att arbeta med i C#-kod.

Efter den här ändringen är det returnerade objektet det underliggande objektet.

Fjärrsupport

PowerShell-fjärrkommunikation (PSRP) med WinRM på Unix-plattformar kräver NTLM/Negotiate eller Grundläggande autentisering via HTTPS. PSRP på macOS stöder endast Grundläggande autentisering via HTTPS. Kerberos-baserad autentisering stöds inte för icke-Windows plattformar.

PowerShell stöder också PowerShell-fjärrkommunikation (PSRP) via SSH på alla plattformar (Windows, macOS och Linux). Mer information finns i SSH-fjärrkommunikation i PowerShell.

PowerShell Direct för containrar försöker använda pwsh först

PowerShell Direct är en funktion i PowerShell och Hyper-V som gör att du kan ansluta till en virtuell Hyper-V-dator eller container utan nätverksanslutning eller andra fjärrhanteringstjänster.

Tidigare anslöt PowerShell Direct med hjälp av den inbyggda Windows PowerShell instansen på containern. Nu försöker PowerShell Direct först ansluta med alla tillgängliga i pwsh.exe PATH miljövariabeln. Om pwsh.exe inte är tillgängligt faller PowerShell Direct tillbaka för att använda powershell.exe .

Enable-PSRemoting skapar nu separata fjärrslutpunkter för förhandsversioner

Enable-PSRemoting skapar nu två fjärrsessionskonfigurationer:

  • En för huvudversionen av PowerShell. Till exempel PowerShell.6. Den här slutpunkten som kan användas för mindre versionsuppdateringar som "systemomfattande" PowerShell 6-sessionskonfiguration
  • En versionsspecifik sessionskonfiguration, till exempel: PowerShell.6.1.0

Det här beteendet är användbart om du vill ha flera PowerShell 6-versioner installerade och tillgängliga på samma dator.

Dessutom får förhandsversioner av PowerShell nu sina egna fjärrkommunikationssessionskonfigurationer när Enable-PSRemoting cmdleten har körts:

C:\WINDOWS\system32> Enable-PSRemoting

Dina utdata kan vara annorlunda om du inte har ställt in WinRM tidigare.

WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.

Sedan kan du se separata PowerShell-sessionskonfigurationer för förhandsversionen och stabila versioner av PowerShell 6 och för varje specifik version.

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 syntax som stöds för SSH

SSH-klienter stöder vanligtvis en anslutningssträng i formatet user@host:port . Med tillägget av SSH som ett protokoll för PowerShell-fjärrkommunikation har vi lagt till stöd för det här formatet för anslutningssträngen:

Enter-PSSession -HostName fooUser@ssh.contoso.com:2222

Telemetri kan bara inaktiveras med en miljövariabel

PowerShell skickar grundläggande telemetridata till Microsoft när den startas. Data omfattar operativsystemnamn, OS-version och PowerShell-version. Med dessa data kan vi bättre förstå de miljöer där PowerShell används och göra det möjligt för oss att prioritera nya funktioner och korrigeringar.

Om du vill avanmäla dig från den här telemetrin anger du POWERSHELL_TELEMETRY_OPTOUT miljövariabeln true till , eller yes 1 . Vi stöder inte längre borttagning av filen DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY för att inaktivera telemetri.