Skillnader mellan Windows PowerShell 5.1 och PowerShell 7.x
Windows PowerShell 5.1 är byggd ovanpå .NET Framework v4.5. Med lanseringen av PowerShell 6.0 blev PowerShell ett öppen källkod projekt som bygger på .NET Core 2.0. Genom att gå från .NET Framework till .NET Core kunde PowerShell bli en plattformsoberoende lösning. PowerShell körs på Windows, macOS och Linux.
Det finns få skillnader i PowerShell-språket mellan Windows PowerShell och PowerShell. De mest anmärkningsvärda skillnaderna är tillgängligheten och beteendet för PowerShell-cmdletar mellan Windows- och icke-Windows-plattformar och de ändringar som härrör från skillnaderna mellan .NET Framework och .NET Core.
Den här artikeln sammanfattar de betydande skillnaderna och de icke-bakåtkompatibla ändringarna mellan Windows PowerShell och den aktuella versionen av PowerShell. Den här sammanfattningen innehåller inte nya funktioner eller cmdletar som har lagts till. Den här artikeln beskriver inte heller vad som har ändrats mellan versionerna. 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 Nyheter för varje version.
- Nyheter i PowerShell 7.3
- Nyheter i PowerShell 7.2
- Nyheter i PowerShell 7.1
- Nyheter i PowerShell 7.0
- Nyheter i PowerShell 6.x
.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 i Microsoft Windows. Detta är viktigt eftersom PowerShell ger direkt åtkomst till de underliggande ramverkstyperna och metoderna. Därför kanske skript som körs på Windows inte körs på plattformar som inte är Windows på grund av skillnaderna i ramverken. Mer information om ändringar i .NET Core finns i Icke-bakåtkompatibla ändringar för migrering från .NET Framework till .NET Core.
Varje ny version av PowerShell bygger på en nyare version av .NET. Det kan finnas icke-bakåtkompatibla ändringar i .NET som påverkar PowerShell.
- PowerShell 7.3 (förhandsversion) – Byggd på .NET 7.0 (förhandsversion)
- PowerShell 7.2 (LTS-current) – Byggd på .NET 6.0 (LTS-current)
- PowerShell 7.1 – Byggt på .NET 5.0
- PowerShell 7.0 (LTS) – Byggt på .NET Core 3.1 (LTS)
- PowerShell 6.2 – Byggt på .NET Core 2.1
- PowerShell 6.1 – Byggt på .NET Core 2.1
- PowerShell 6.0 – Byggt på .NET Core 2.0
I och med tillkomsten av .NET Standard 2.0 kan PowerShell läsa in många traditionella Windows PowerShell moduler 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 nedrullningsbara menyn längst upp till vänster på sidan. Det konceptuella innehållet ändras inte när du ändrar versioner. I allmänhet gäller begreppen för alla versioner av PowerShell, såvida inte artikeln innehåller en specifik version.
- PowerShell – Det här är standardnamnet som vi använder för produkten. När vi använder det här namnet i dokumentationen talar vi om den aktuella versionen av PowerShell. Skillnader mellan PowerShell och Windows PowerShell noteras genom att notera den specifika versionen.
- Windows PowerShell – PowerShell bygger på .NET Framework. Windows PowerShell levereras endast i Windows och kräver hela ramverket. Det går att köra både PowerShell och Windows PowerShell på samma Windows-dator.
Moduler som inte längre levereras 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 tog vi bort PowerShell-arbetsflödet från PowerShell.
I framtiden vill vi aktivera intern parallellitet/samtidighet i PowerShell-språket utan att behöva PowerShell-arbetsflöde.
Om det finns ett behov av att 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 os-start, men skriptet måste behålla sitt eget tillstånd (som att spara det i en fil).
Cmdletar har tagits bort från PowerShell
För de moduler som ingår i PowerShell togs följande cmdletar 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-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-cmdletar
Följande WMI v1-cmdletar togs bort från PowerShell:
Register-WmiEventSet-WmiInstanceInvoke-WmiMethodGet-WmiObjectRemove-WmiObject
CimCmdlets-modulen (även kallat WMI v2) utför samma funktion och ger nya funktioner och en omdesignad syntax.
New-WebServiceProxy cmdleten har tagits bort
.NET Core stöder inte Windows Communication Framework, som tillhandahåller tjänster för användning av SOAP-protokollet. Den här cmdleten togs bort eftersom den kräver SOAP.
*-Transaction cmdletar har tagits bort
Dessa cmdletar hade mycket begränsad användning. Beslutet fattades att avbryta stödet för dem.
Complete-TransactionGet-TransactionStart-TransactionUndo-TransactionUse-Transaction
*-EventLog cmdletar
På grund av användning av API:er *-EventLog som inte stöds har cmdletarna tagits bort från PowerShell.
Get-WinEvent och New-WinEvent är tillgängliga för att hämta och skapa händelser i Windows.
Cmdletar som använder Windows Presentation Framework (WPF)
.NET Core 3.1 har lagt till stöd för WPF, så versionen av PowerShell 7.0 återställde följande Windows-specifika funktioner:
- Cmdleten
Show-Command - Cmdleten
Out-GridView - 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 MODULen PSDesiredStateConfiguration tagits bort från PowerShell och har publicerats till PowerShell-galleriet. Mer information finns i [meddelande][PSDSC-announce] i PowerShell-teamets blogg.
Körbara ändringar i PowerShell
powershell.exe har bytt namn till pwsh.exe
Det binära namnet 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 installationer sida vid sida av Windows PowerShell och PowerShell.
Ytterligare ändringar i pwsh(.exe) från powershell.exe:
- Ändrade den första positionsparametern från
-Commandtill-File. Den här ändringen åtgärdar användningen av#!(även kallat shebang) i PowerShell-skript som körs från icke-PowerShell-gränssnitt på plattformar som inte är Windows-plattformar. Det innebär också att du kan köra kommandon sompwsh foo.ps1ellerpwsh fooScriptutan att-Fileange . Den här ändringen kräver dock att du uttryckligen anger-celler-Commandnär du försöker köra kommandon sompwsh.exe -Command Get-Command. pwshaccepterar växeln-i(eller-Interactive) för att indikera ett interaktivt gränssnitt. Detta gör att PowerShell kan användas som standardgränssnitt på Unix-plattformar.- Parametrar har
-ImportSystemModulestagits bort och-PSConsoleFilefrånpwsh.exe. - Ändrad
pwsh -versionoch inbyggd hjälp förpwsh.exeatt anpassa sig till andra inbyggda verktyg. - Ogiltiga argumentfelmeddelanden för
-Fileoch-Commandslutkoder som överensstämmer med Unix-standarder - Parametern har lagts till
-WindowStylei Windows. På samma sätt är paketbaserade installationsuppdateringar på andra plattformar än Windows-uppdateringar på plats.
Det förkortade namnet överensstämmer också med namngivning av gränssnitt på plattformar som inte är Windows-plattformar.
Stöd för att köra ett PowerShell-skript med bool-parameter
Tidigare använde du pwsh.exe för att köra ett PowerShell-skript med hjälp av -File inget sätt att skicka $true/$false som parametervärden. Stöd för $true/$false som parsade värden till parametrar har lagts till. Switch-värden stöds också.
Förbättrad bakåtkompatibilitet med Windows PowerShell
För Windows läggs en ny switchparameter UseWindowsPowerShell till i Import-Module. Den här växeln skapar en proxymodul i PowerShell 7 som använder en lokal Windows PowerShell process för att implicit köra alla cmdletar som finns i modulen. Mer information finns i Import-Module.
Mer information om vilka Microsoft-moduler som fungerar med PowerShell 7.0 finns i tabellen Modulkompatibilitet.
Microsoft Update-stöd för Windows
PowerShell 7.2 har lagt till stöd för Microsoft Update. När du aktiverar den här funktionen får du de senaste PowerShell 7-uppdateringarna i ditt traditionella hanteringsflöde för Windows Update (WU), oavsett om det är med Windows Update för företag, WSUS, SCCM eller den interaktiva WU-dialogrutan i Inställningar.
PowerShell 7.2 MSI-paketet innehåller följande kommandoradsalternativ:
USE_MU– Den här egenskapen har två möjliga värden:1(standard) – Väljer att uppdatera via Microsoft Update eller WSUS0– Välj inte att uppdatera via Microsoft Update eller WSUS
ENABLE_MU1(standard) – Väljer att använda Microsoft Update för automatisk Uppdateringar eller Windows Update0– Välj inte att använda Microsoft Update Uppdateringar eller Windows Update
Motorändringar
Stöd för PowerShell som standard-Unix-gränssnitt
I Unix är det en konvention för gränssnitt att acceptera -i för ett interaktivt gränssnitt och många verktyg förväntar sig detta beteende (script till exempel när powershell anges som standardgränssnitt) och anropar gränssnittet med växeln -i . Den här ändringen bryter in som -i tidigare kunde användas som kort hand för att matcha -inputformat, som nu måste vara -in.
Anpassade snapin-moduler
PowerShell-snapin-moduler är en föregångare till PowerShell-moduler som inte har omfattande implementering i PowerShell-communityn.
På grund av komplexiteten i att stödja snapin-moduler och deras brist på användning i communityn stöder vi inte längre anpassade snapin-moduler i PowerShell.
Experimentella funktionsflaggor
PowerShell 6.2-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 icke-bakåtkompatibla ä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ättning från modulbassökvägen innan du försöker läsa in från GAC
Tidigare, när en binär modul har modulsammansättningen i GAC, läste vi in sammansättningen från GAC innan vi försökte läsa in den från modulbassökvägen.
Hoppa över null-elementkontroll för samlingar med en värdetypselementtyp
För parametern Mandatory och ValidateNotNull attributen ValidateNotNullOrEmpty hoppar du över null-elementkontrollen om samlingens elementtyp är värdetyp.
Bevara $? för ParenExpression, SubExpression och ArrayExpression
Den här PR:n ändrar hur vi kompilerar underpipeliner (...), underuttryck $(...) och matrisuttryck @() så att $? det inte är automatiskt sant. I stället beror värdet $? för på resultatet av den pipeline eller de instruktioner som körs.
Åtgärda $? till att inte vara $false när det interna kommandot skriver till stderr
$? är inte inställt på $false när det interna kommandot skriver till stderr. Det är vanligt att interna kommandon skrivs till stderr utan att ange ett fel. $? anges endast till $false 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 skrivs till stderr utan att ange ett fel. Med den här ändringen stderr hämtas fortfarande utdata i ErrorRecord-objekt , men körningen gäller $ErrorActionPreference inte längre om ErrorRecord kommer från ett internt kommando.
Ändra $OutputEncoding för att använda UTF-8 NoBOM kodning i stället för ASCII
Den tidigare kodningen, ASCII (7-bitars), skulle resultera i en felaktig ändring av utdata i vissa fall. Standardinställningen UTF-8 NoBOM bevarar Unicode-utdata med en kodning som stöds av de flesta verktyg och operativsystem.
Förena cmdletar med parametern -Encoding som ska vara av typen System.Text.Encoding
Värdet -EncodingByte har tagits bort från filsystemproviderns cmdletar. En ny parameter, -AsByteStream, används nu för att ange att en byteström krävs som indata eller att utdata är en ström med byte.
Ändra New-ModuleManifest kodning till UTF8NoBOM på plattformar som inte är Windows-plattformar
New-ModuleManifest Tidigare skapades psd1 manifest i UTF-16 med BOM, vilket skapade ett problem för Linux-verktyg. Den här icke-bakåtkompatibla ändringen ändrar kodningen av New-ModuleManifest till UTF (ingen BOM) på plattformar som inte är Windows.
Ta bort AllScope från de flesta standardalias
För att påskynda skapandet AllScope av omfånget har tagits bort från de flesta standardalias. AllScope lämnades för några vanliga alias där sökningen gick snabbare.
-Verbose och -Debug åsidosätter inte längre $ErrorActionPreference
Tidigare, om -Verbose eller -Debug har angetts, överströs beteendet för $ErrorActionPreference. Med den här ändringen -Verbose och -Debug påverkar inte längre beteendet $ErrorActionPreferenceför .
Dessutom anges $DebugPreference parametern -Debug till Fortsätt i stället för Fråga.
Göra $PSCulture konsekventa ändringar i sessionskulturen
I Windows PowerShell cachelagras det aktuella kulturvärdet, vilket kan göra att värdet inte synkroniseras med kulturen när sessionen startas. Det här cachelagringsbeteendet har åtgärdats i PowerShell Core.
Tillåt uttryckligen angiven namngiven parameter för att ersätta samma från hashtable-splatting
Med den här ändringen flyttas de namngivna parametrarna från splatting till slutet av parameterlistan så att de är bundna när alla uttryckligen angivna namngivna parametrar är bundna. Parameterbindning för enkla funktioner genererar inget fel när det inte går att hitta en angiven namngiven parameter. Okända namngivna parametrar är bundna till parametern $args 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 föregående beteende är MyPath inte bundet till -Path eftersom det är det tredje argumentet i argumentlistan. ## Så det slutar med att det fylls 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 argumenten från @hash 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
Språkändringar
Operatorn Null-coalescing ??
Operatorn ?? null-coalescing returnerar värdet för dess vänstra operand om den inte är null. Annars utvärderas den högra operanden och dess resultat returneras. Operatorn ?? utvärderar inte dess högra operand om den vänstra operand utvärderas till icke-null.
$x = $null
$x ?? 100
100
I följande exempel utvärderas inte den högra operanden.
[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020
Operatorn Null-coalescing assignment ??=
Operatorn ??= för null-coalescing-tilldelning tilldelar värdet för sin högra operand till sin vänstra operand endast om den vänstra operand utvärderas till null. Operatorn ??= utvärderar inte dess högra operand om den vänstra operand utvärderas till icke-null.
$x = $null
$x ??= 100
$x
100
I följande exempel utvärderas inte den högra operanden.
[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020
Null-villkorsstyrda operatorer
Anteckning
Den här funktionen har flyttats från experimentell till mainstream i PowerShell 7.1.
En null-villkorsoperator tillämpar en medlemsåtkomst, ?., eller elementåtkomst, ?[], åtgärd på dess operand endast om operand utvärderas till icke-null. Annars returneras null.
Eftersom PowerShell kan ? ingå i variabelnamnet krävs en formell specifikation av variabelnamnet för att använda dessa operatorer. Det är därför nödvändigt att använda {} runt variabelnamn ${a} som eller när ? är en del av variabelnamnet ${a?}.
I följande exempel returneras värdet för PropName .
$a = @{ PropName = 100 }
${a}?.PropName
100
Följande exempel returnerar null utan att försöka komma åt medlemsnamnet PropName.
$a = $null
${a}?.PropName
På samma sätt returneras värdet för elementet.
$a = 1..10
${a}?[0]
1
Och när operanden är null används inte elementet och null returneras.
$a = $null
${a}?[0]
Anteckning
Syntaxen ${<name>} för variabelnamn för ska inte förväxlas med $() underuttrycksoperatorn. Mer information finns i avsnittet Variabelnamn i about_Variables.
Operatorn har lagts till & för jobbkontroll
Om du placerar & i slutet av en pipeline körs pipelinen som ett PowerShell-jobb. När en pipeline har bakgrund returneras ett jobbobjekt. När pipelinen körs som ett jobb kan alla standard-cmdletar *-Job användas för att hantera jobbet. Variabler (ignorerar processspecifika variabler) som används i pipelinen kopieras automatiskt till jobbet så Copy-Item $foo $bar & fungerar bara. Jobbet körs också i den aktuella katalogen i stället för användarens hemkatalog.
Nya metoder/egenskaper på PSCustomObject
Vi har lagt till nya metoder och egenskaper i PSCustomObject. PSCustomObject innehå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 metoder och Where 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 ett ombud. På så sätt kan du göra saker som att skicka PSMethod[M]::DoubleStrLen som ett ombudsvä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)
Beteende för strängjämförelse har ändrats i PowerShell 7.1
PowerShell 7.1 bygger på .NET 5.0, som introducerade följande icke-bakåtkompatibla ändring:
Från och med .NET 5.0 ignorerar kulturvarianta strängjämförelser icke-utskriftskontrolltecken.
Följande två strängar anses till exempel vara identiska:
# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True
Nya cmdletar
Ny cmdlet för Get-Uptime
Cmdleten Get-Uptime returnerar den tid som förflutit sedan den senaste starten av operativsystemet. Cmdleten introducerades i PowerShell 6.0.
Ny cmdlet för Remove-Alias
Cmdleten Remove-Alias tar bort ett alias från den aktuella PowerShell-sessionen. Cmdleten introducerades i PowerShell 6.0.
Ny cmdlet Remove-Service
Cmdleten Remove-Service tar bort en Windows-tjänst i registret och i tjänstdatabasen.
Cmdleten Remove-Service introducerades i PowerShell 6.0.
Nya Markdown-cmdletar
Markdown är en standard för att skapa läsbara klartextdokument med grundläggande formatering som kan renderas i HTML.
Följande cmdletar har lagts till i PowerShell 6.1:
- ConvertFrom-Markdown – Konvertera innehållet i en sträng eller en fil till ett MarkdownInfo-objekt .
- Get-MarkdownOption – returnerar de aktuella färgerna och formaten som används för att återge Markdown-innehåll i konsolen.
- Set-MarkdownOption – Anger de färger och format som används för att återge Markdown-innehåll i konsolen.
- Show-Markdown – Visar Markdown-innehåll i konsolen eller som HTML
Ny cmdlet för Test-Json
Test-Json-cmdleten testar om en sträng är ett giltigt JSON-dokument (JavaScript Object Notation) och kan eventuellt verifiera JSON-dokumentet mot ett angivet schema.
Den här cmdleten introducerades i PowerShell 6.1
Nya cmdletar för att stödja experimentella funktioner
Följande cmdletar har lagts till i PowerShell 6.2 för att stödja experimentella funktioner.
Ny cmdlet för Join-String
Cmdleten Join-String kombinerar objekt från pipelinen till en enda sträng. Denna cmdlet har lagts till i PowerShell 6.2.
Ny vy– ConciseView och cmdlet Get-Error
PowerShell 7.0 förbättrar visningen av felmeddelanden för att förbättra läsbarheten för interaktiva fel och skriptfel med en ny standardvy, ConciseView. Vyerna kan väljas av användaren via inställningsvariabeln $ErrorView.
Om ett fel inte kommer från ett skript- eller parserfel med ConciseView är det ett felmeddelande med en rad:
Get-Childitem -Path c:\NotReal
Get-ChildItem: Cannot find path 'C:\NotReal' because it does not exist
Om felet inträffar under skriptkörningen eller är ett parsningsfel returnerar PowerShell ett flerradsfel som innehåller felet, en pekare och ett felmeddelande som visar var felet finns på den raden. Om terminalen inte stöder ANSI-färgutrymningssekvenser (VT100) visas inte färger.
Standardvyn i PowerShell 7 är ConciseView. Den tidigare standardvyn var NormalView och du kan välja detta genom att ange inställningsvariabeln $ErrorView.
$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView
Anteckning
En ny egenskap ErrorAccentColor läggs till i för att $Host.PrivateData stöda ändring av accentfärgen för felmeddelandet.
Den nya Get-Errorcmdleten ger en fullständig detaljerad vy över det fullständigt kvalificerade felet när du vill. Som standard visar cmdleten fullständig information, inklusive inre undantag, om det senaste felet som inträffade.
Cmdleten Get-Error stöder indata från pipelinen med hjälp av den inbyggda variabeln $Error.
Get-Error visar alla piped-fel.
$Error | Get-Error
Cmdleten Get-Error stöder parametern Newest , så att du kan ange hur många fel från den aktuella sessionen som du vill ska visas.
Get-Error -Newest 3 # Displays the lst three errors that occurred in the session
Mer information finns i Get-Error.
Cmdlet-ändringar
Parallell körning har lagts till i ForEach-Object
Från och med PowerShell 7.0 har cmdleten ForEach-Object , som itererar objekt i en samling, nu inbyggd parallellitet med den nya parallella parametern.
Som standard använder parallella skriptblock den aktuella arbetskatalogen för anroparen som startade de parallella uppgifterna.
Det här exemplet hämtar 50 000 loggposter från 5 systemloggar på en lokal Windows-dator:
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
$logEntries = $logNames | ForEach-Object -Parallel {
Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5
$logEntries.Count
50000
Parametern Parallel anger skriptblocket som körs parallellt för varje indataloggnamn.
Den nya parametern ThrottleLimit begränsar antalet skriptblock som körs parallellt vid en viss tidpunkt. Standardvärdet är 5.
Använd variabeln $_ för att representera det aktuella indataobjektet i skriptblocket. Använd omfånget $using: för att skicka variabelreferenser till skriptblocket som körs.
Mer information finns i ForEach-Object.
Sök efter system32 kompatibla inbyggda moduler i 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 startas ingår $windir\System32 det automatiskt som en del av PSModulePath miljövariabeln. Den exponerar dock bara moduler för Get-Module och om den CompatiblePSEdition är markerad som kompatibel med CoreImport-Module .
Du kan åsidosätta det här beteendet om du vill visa alla moduler med hjälp av växelparametern -SkipEditionCheck .
Vi har också lagt till en PSEdition egenskap i tabellutdata.
-lp alias för alla -LiteralPath parametrar
Vi har skapat ett standardparameteralias -lp för alla inbyggda PowerShell-cmdletar som har en -LiteralPath parameter.
Åtgärda Get-Item -LiteralPath a*b om a*b det faktiskt inte finns för att returnera fel
-LiteralPath Tidigare skulle ett jokertecken behandla det på samma sätt som -Path och om jokertecknet inte hittade några filer skulle det avslutas tyst. Rätt beteende bör vara att -LiteralPath är literal, så om filen inte finns bör den fel. Ändringen är att behandla jokertecken som används med -Literal som literaler.
Ange arbetskatalog till aktuell katalog i Start-Job
Cmdleten Start-Job använder nu den aktuella katalogen som arbetskatalog för det nya jobbet.
Ta bort -Protocol från *-Computer cmdletar
På grund av problem med RPC-fjärrkommunikation i CoreFX (särskilt på icke-Windows-plattformar) och säkerställer en konsekvent fjärrkommunikationsupplevelse i PowerShell, togs parametern -Protocol bort från \*-Computer cmdletarna. DCOM stöds inte längre för fjärrkommunikation. Följande cmdletar stöder endast WSMAN-fjärrkommunikation:
Rename-ComputerRestart-ComputerStop-Computer
Ta bort -ComputerName från *-Service cmdletar
För att uppmuntra konsekvent användning av PSRP har parametern -ComputerName tagits bort från *-Service cmdletar.
Korrigering Get-Content -Delimiter för att inte inkludera avgränsare i de returnerade raderna
Tidigare var utdata vid användning Get-Content -Delimiter inkonsekventa och obekväma eftersom det krävde ytterligare bearbetning av data för att ta bort avgränsare. Den här ändringen tar bort avgränsare i returnerade rader.
Ändringar i Format-Hex
Parametern -Raw är nu en "no-op" (eftersom 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 parametern -Raw gjorde före den här ändringen.
Stavfelskorrigering i Get-ComputerInfo egenskapsnamn
BiosSerialNumber stavningsfel BiosSeralNumber och har ändrats till rätt stavning.
Lägg till Get-StringHash och Get-FileHash cmdletar
Den här ändringen är att vissa hash-algoritmer inte stöds av CoreFX, därför är de inte längre tillgängliga:
MACTripleDESRIPEMD160
Lägg till validering på Get-* cmdletar där skickande $null returnerar alla objekt i stället för fel
Att skicka $null till något av följande genererar nu ett fel:
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
Lägg till stöd för W3C Extended Log File Format i Import-Csv
Tidigare kan cmdleten Import-Csv inte användas för att importera loggfilerna direkt i W3C-utökat loggformat och ytterligare åtgärder krävs. Med den här ändringen stöds det utökade loggformatet W3C.
Import-CsvPSTypeNames gäller vid import när typinformation finns i CSV
Tidigare bevarade inte objekt som exporterades med Export-CSV importerad TypeInformation med ConvertFrom-Csv typinformationen. Den här ändringen lägger till typinformationen till PSTypeNames medlemmen om den är tillgänglig från CSV-filen.
-NoTypeInformation är standardinställningen på Export-Csv
Tidigare skulle cmdleten Export-CSV mata ut en kommentar som den första raden som innehåller objektets typnamn. Ändringen exkluderar typinformationen som standard eftersom den inte förstås av de flesta CSV-verktyg. Den här ändringen gjordes för att åtgärda 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, -LiteralPath med tanke på att ett jokertecken skulle behandla det på samma sätt som -Path och om jokertecknet inte hittade några filer, skulle det tyst avslutas. Rätt beteende bör vara att -LiteralPath det är literal, så om filen inte finns bör den fel. Ändring är att behandla jokertecken som används med -Literal som literal.
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å ordningen kan du brytas av den här ändringen om du vill ha den första gruppen. Vi har beslutat 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 och med nu innehåller 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 nu har parametern Password , som tar en SecureString. På så sätt kan du använda det 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 i Windows som heter more den omslutna more.com. Den funktionen har nu tagits bort.
help Dessutom har funktionen ändrats så att den används more.com i Windows eller systemets standardsökare som anges av $env:PAGER på plattformar som inte är Windows.
cd DriveName: returnerar nu användare till den aktuella arbetskatalogen på den enheten
Tidigare skickade eller Set-Locationcd för att återgå till en PSDrive användare till standardplatsen för enheten. Användarna skickas nu till den senast 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>
cdcd -- Och ändra till $HOME.
Update-Help som icke-administratör
Efter populär efterfrågan Update-Help behöver du inte längre köras som administratör. Update-Help sparar nu som standard hjälp till en mapp med användaromfång.
Where-Object -Not
Med tillägget av -Not parametern till Where-Objectkan filtrera ett objekt i pipelinen för att en egenskap inte finns eller ett null-/tomt egenskapsvärde.
Det här kommandot returnerar till exempel alla tjänster som inte har några definierade beroende tjänster:
Get-Service | Where-Object -Not DependentServices
Ändringar i webb-cmdletar
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. Den här ändringen tillsammans med bristande samverkan med Internet Explorer har dock resulterat i flera icke-bakåtkompatibla ändringar i Invoke-WebRequest och Invoke-RestMethod.
Invoke-WebRequeststöder nu endast grundläggande HTML-parsning.Invoke-WebRequestreturnerar alltid ettBasicHtmlWebResponseObjectobjekt. EgenskapernaParsedHtmlochFormshar tagits bort.BasicHtmlWebResponseObject.Headersvärdena är nuString[]i ställetStringför .BasicHtmlWebResponseObject.BaseResponseär nu ettSystem.Net.Http.HttpResponseMessageobjekt.- Egenskapen
Responseför web-cmdlet-undantag är nu ettSystem.Net.Http.HttpResponseMessageobjekt. - Strikt RFC-rubrikparsing är nu standard för parametern
-Headersoch-UserAgent. Detta kan kringgås med-SkipHeaderValidation. file://ochftp://URI-scheman stöds inte längre.System.Net.ServicePointManagerinställningarna respekteras inte längre.- Det finns för närvarande ingen certifikatbaserad autentisering tillgänglig på macOS.
- Användning av
-Credentialöver enhttp://URI resulterar i ett fel. Använd enhttps://URI eller ange parametern-AllowUnencryptedAuthenticationför att förhindra felet. -MaximumRedirectionskapar 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 till utf-8-kodning som standard för JSON-svar. När 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-jsonsvar - Parametern har lagts
-SkipHeaderValidationtill för att tillåtaContent-Typerubriker som inte är standardkompatibla - Parametern har lagts
-Formtill för att stödja förenklatmultipart/form-datastöd - Kompatibel, skiftlägesokänslig hantering av relationsnycklar
- Parametern för webb-cmdletar har lagts till
-Resume
Invoke-RestMethod returnerar användbar information när inga data returneras
När ett API returnerar bara nullserialiserades Invoke-RestMethod 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 ett giltigt JSON-literalvärde null som $null.
Webb-cmdletar varnar när -Credential skickas över 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 osäkert. Användarna kan kringgå detta med hjälp av växeln -AllowUnencryptedAuthentication .
Gör -OutFile så att parametern i webb-cmdletar fungerar som -LiteralPath
Från och med PowerShell 7.1 fungerar OutFile-parametern för webb-cmdletar som LiteralPath och bearbetar inte jokertecken.
API-ändringar
Ta bort AddTypeCommandBase klass
Klassen AddTypeCommandBase togs bort från Add-Type för att förbättra prestandan. Den här klassen används endast av cmdleten Add-Type och bör inte påverka användarna.
Tagits bort VisualBasic som ett språk som stöds i Add-Type
Tidigare kunde du kompilera Visual Basic-kod med hjälp av cmdleten Add-Type . 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 bort RunspaceConfiguration
När du tidigare skapade ett PowerShell-körningsutrymme programmatiskt med hjälp av API:et kan du använda de äldre RunspaceConfiguration eller nyare InitialSessionState klasserna.
Den här ändringen tog bort stöd för RunspaceConfiguration och stöder InitialSessionStateendast .
CommandInvocationIntrinsics.InvokeScript binda argument till $input i 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 bort ClrVersion och BuildVersion egenskaper från $PSVersionTable
Egenskapen ClrVersion$PSVersionTable för är inte användbar med CoreCLR. Slutanvändarna bör inte använda det värdet för att fastställa kompatibiliteten.
Egenskapen BuildVersion var kopplad till Versionen av Windows-versionen, som inte är tillgänglig på plattformar som inte är Windows.The property was tied to the Windows build version, which is not available on non-Windows platforms. GitCommitId Använd egenskapen 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 literal `uundfly du backticken: ``u.
Problem med ValueFromRemainingArguments parameterbindning 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.
Rensat 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 icke-bakåtkompatibla ändringar påverkar främst hjälpproviderns kod.
- Ändra de offentliga konstruktorerna
WorkflowInfotill interna. Vi stöder inte arbetsflöde längre, så det är klokt att inte tillåta att personer skaparWorkflowinstanser. - Ta bort typen System.Management.Automation.DebugSource eftersom den bara används för felsökning av arbetsflöden.
- Ta bort överlagringen av från den abstrakta klassen Felsökare som endast används för felsökning av
SetParentarbetsflöden. - Ta bort samma överlagring av
SetParentfrån den härledda klassen RemotingJobDebugger.
Omslut inte returresultatet PSObject när du konverterar en ScriptBlock till ett ombud
När en ScriptBlock konverteras till en ombudstyp som ska användas i C#-kontext medför omslutning av resultatet i en PSObject onödiga problem:
- När värdet konverteras till ombudets returtyp, packas i
PSObjectprincip upp.PSObjectSå är onödig. - När den delegerade returtypen är
object, omsluts den i enPSObjectvilket gör det svårt att arbeta med i C#-kod.
Efter den här ändringen är det returnerade objektet det underliggande objektet.
Stöd för fjärrkommunikation
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 plattformar som inte är Windows-plattformar.
PowerShell stöder även 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] [psdirect] ä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 den inbyggda Windows PowerShell-instansen i containern. Nu försöker PowerShell Direct först ansluta med hjälp av alla tillgängliga i pwsh.exePATH miljövariabeln. Om pwsh.exe inte är tillgängligt återgår PowerShell Direct till att använda powershell.exe.
Enable-PSRemoting skapar nu separata fjärrkommunikationsslutpunkter för förhandsversioner
Enable-PSRemoting skapar nu två konfigurationer för fjärrkommunikationssessioner:
- En för huvudversionen av PowerShell. Till exempel
PowerShell.6. Den här slutpunkten som kan användas i delversionsuppdateringar 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 egna konfigurationer för fjärrkommunikationssessioner när cmdleten Enable-PSRemoting har körts:
C:\WINDOWS\system32> Enable-PSRemoting
Dina utdata kan skilja sig om du inte har konfigurerat 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 de startas. Data innehåller operativsystemets namn, operativsystemversion 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 välja bort den här telemetrin anger du miljövariabeln POWERSHELL_TELEMETRY_OPTOUT till true, yeseller 1. Vi stöder inte längre borttagning av filen DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY för att inaktivera telemetri.