Skillnader mellan Windows PowerShell 5.1 och PowerShell 7.x
Windows PowerShell 5.1 bygger på .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 flytta från .NET Framework till .NET Core kunde PowerShell bli en plattformsoberoende lösning. PowerShell körs i 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 beror på 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 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 Nyheter för varje version.
- Nyheter i PowerShell 7.5
- Nyheter i PowerShell 7.4
- 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 i Linux och macOS använder .NET Core, som är en delmängd av det fullständiga .NET Framework i Microsoft Windows. Detta är viktigt eftersom PowerShell ger direkt åtkomst till de underliggande ramverkstyperna och metoderna. Det innebär att skript som körs i Windows kanske 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.5 – Bygger på .NET 9.0
- PowerShell 7.4 – Bygger på .NET 8.0
- PowerShell 7.3 – Bygger på .NET 7.0
- PowerShell 7.2 (LTS-current) – Byggd på .NET 6.0 (LTS-current)
- PowerShell 7.1 – Bygger på .NET 5.0
- PowerShell 7.0 (LTS) – byggd på .NET Core 3.1 (LTS)
- PowerShell 6.2 – Bygger på .NET Core 2.1
- PowerShell 6.1 – Bygger på .NET Core 2.1
- PowerShell 6.0 – Bygger på .NET Core 2.0
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:
Var medveten om ändringar i .NET-metoden
Även om .NET-metodändringar inte är specifika för PowerShell kan de påverka dina skript, särskilt om du anropar .NET-metoder direkt. Det kan också finnas nya överlagringar för konstruktorer. Detta kan påverka hur du skapar objekt med hjälp av New-Object
eller [type]::new()
metoden.
.NET har till exempel lagt till överlagringar i metoden [System.String]::Split()
som inte är tillgänglig i .NET Framework 4.5. I följande lista visas överlagringarna för metoden Split()
som är tillgänglig i Windows PowerShell 5.1:
PS> "".Split
OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)
I följande lista visas överlagringarna för metoden som Split()
är tillgänglig i PowerShell 7:
"".Split
OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)
I Windows PowerShell 5.1 kan du skicka en teckenmatris (char[]
) till Split()
metoden som en string
. Metoden delar upp målsträngen vid varje förekomst av ett tecken i matrisen. Följande kommando delar upp målsträngen i Windows PowerShell 5.1, men inte i PowerShell 7:
# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333
Om du vill binda till rätt överlagring måste du skrivasträngen till en teckenmatris:
# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333
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 operativsystemstart, men skriptet skulle behöva behålla sitt eget tillstånd (som att spara det i en fil).
Cmdletar som 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ändning 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-cmdletar
Följande WMI v1-cmdletar har tagits bort från PowerShell:
Register-WmiEvent
Set-WmiInstance
Invoke-WmiMethod
Get-WmiObject
Remove-WmiObject
CimCmdlets-cmdletarna (ä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 har tagits bort eftersom den kräver SOAP.
*-Transaction
cmdletar har tagits bort
Dessa cmdletar hade mycket begränsad användning. Beslutet fattades att upphöra med stödet till dem.
Complete-Transaction
Get-Transaction
Start-Transaction
Undo-Transaction
Use-Transaction
*-EventLog
Cmdlets
På grund av användningen 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 meddelandet i PowerShell Team-bloggen.
Körbara PowerShell-ändringar
powershell.exe
har bytt namn till pwsh.exe
Det binära namnet på PowerShell har ändrats från powershell(.exe)
till pwsh(.exe)
. Den här ändringen ger 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
-Command
till-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.ps1
ellerpwsh fooScript
utan att-File
ange . Den här ändringen kräver dock att du uttryckligen anger-c
eller-Command
när du försöker köra kommandon sompwsh.exe -Command Get-Command
. pwsh
accepterar 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.- Parametrarna
-ImportSystemModules
har tagits bort och-PSConsoleFile
frånpwsh.exe
. - Ändrad
pwsh -version
och inbyggd hjälp förpwsh.exe
att anpassa till andra inbyggda verktyg. - Ogiltiga argumentfelmeddelanden för
-File
och-Command
slutkoder som överensstämmer med Unix-standarder - Parametern har lagts till
-WindowStyle
i Windows. På samma sätt är paketbaserade installationsuppdateringar på icke-Windows-plattformar 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 tolkade värden för 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 växelparameter 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_MU
1
(standard) – Väljer att använda Microsoft Update den automatiska Uppdateringar eller Windows Update0
– Välj inte att använda Microsoft Update den automatiska 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 det här beteendet (script
till exempel och när du anger PowerShell 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
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äs in sammansättningen 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 subpipelines (...)
, 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.
Korrigering $?
som inte ska 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 avsikt att indikera ett fel. $?
anges till $false
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 skrivs till stderr
utan avsikt att indikera ett fel. Med den här ändringen stderr
registreras fortfarande utdata i ErrorRecord-objekt , men körningen gäller $ErrorActionPreference
inte längre om ErrorRecord kommer från ett internt kommando.
Ändra $OutputEncoding
om du vill använda UTF-8 NoBOM
kodning i stället för ASCII
Den tidigare kodningen, ASCII (7-bitars), skulle resultera i 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 parameter som -Encoding
ska vara av typen System.Text.Encoding
Värdet -Encoding
Byte
har tagits bort från cmdletarna för filsystemprovidern. 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 skapar ett problem för Linux-verktyg. Den här icke-bakåtkompatibla ändringen ändrar kodningen av till UTF (ingen strukturliste) på plattformar som inte är Windows.This breaking change changes the encoding of New-ModuleManifest
to be UTF (no BOM) in non-Windows platforms.
Ta bort AllScope
från de flesta standardalias
För att påskynda skapande AllScope
av omfång har tagits bort från de flesta standardalias. AllScope
lämnades för några vanliga alias där sökningen var snabbare.
-Verbose
och -Debug
åsidosätter inte längre $ErrorActionPreference
Tidigare, om -Verbose
eller -Debug
har angetts, överskrör det beteendet $ErrorActionPreference
för . Med den här ändringen -Verbose
och -Debug
påverkar inte längre beteendet $ErrorActionPreference
för .
Parametern -Debug
ställer också in $DebugPreference
på Fortsätt i stället för Fråga.
Gör $PSCulture
konsekvent ä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 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 utlöser 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
.
Till exempel:
function SimpleTest {
param(
$Name,
$Path
)
"Name: $Name; Path: $Path; Args: $args"
}
I det tidigare beteendet ä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 sin högra operand om den vänstra operanden 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
Null-sammanslutande tilldelningsoperator ??=
Tilldelningsoperatorn ??=
null-coalescing tilldelar endast värdet för sin högra operande till sin vänstra operande om den vänstra operanden utvärderas till null. Operatorn ??=
utvärderar inte sin högra operand om den vänstra operanden 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
Kommentar
Den här funktionen har flyttats från experimentell till mainstream i PowerShell 7.1.
En null-villkorsoperator tillämpar endast en medlemsåtkomst, ?.
, eller elementåtkomst, ?[]
på dess operand om operanden 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. Därför måste du använda {}
runt variabelnamnen som ${a}
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 operand är null används inte elementet och null returneras.
$a = $null
${a}?[0]
Kommentar
Syntaxen för variabelnamn för ${<name>}
bör inte förväxlas med $()
underuttrycksoperatorn. Mer information finns i avsnittet Variabelnamn i about_Variables.
Operatorn för jobbkontroll har lagts till &
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 som Where
gör att du kan använda och filtrera objekt PSCustomObject
:
$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
1
Konverteringar från PSMethod till Ombud
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 Get-Uptime-cmdlet
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 ta bort 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 återges 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 Test-Json-cmdlet
Cmdleten Test-Json testar om en sträng är ett giltigt JSON-dokument (JavaScript Object Notation) och kan även 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 kopplingssträng
Cmdleten Join-String kombinerar objekt från pipelinen till en enda sträng. Den här cmdleten lades till i PowerShell 6.2.
Ny vy – ConciseView och cmdleten 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 parsningsfel 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 felmeddelande med flera rader 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
Kommentar
En ny egenskap ErrorAccentColor läggs till för att $Host.PrivateData
ge stöd för att ändra accentfärgen för felmeddelandet.
Den nya Get-Error
cmdleten 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 visa.
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 det skriptblock som körs parallellt för varje indataloggnamn.
Den nya parametern ThrottleLimit begränsar antalet skriptblock som körs parallellt vid en viss tidpunkt. Standardinställningen ä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 till Get-Module
och om den CompatiblePSEdition
är markerad som kompatibel med Core
Import-Module
.
Du kan åsidosätta det här beteendet för att visa alla moduler med hjälp av switchparametern -SkipEditionCheck
.
Vi har också lagt till en PSEdition
egenskap i tabellutdata.
-lp
alias för alla -LiteralPath
parametrar
Vi skapade 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 något fel för att returnera felet
Tidigare skulle -LiteralPath
ett jokertecken 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
är literal, så om filen inte finns bör det fel. Ändring är att behandla jokertecken som används med -Literal
som literal.
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älla 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-Computer
Restart-Computer
Stop-Computer
Ta bort -ComputerName
från *-Service
cmdletar
För att uppmuntra till konsekvent användning av PSRP togs parametern -ComputerName
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 sin 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:
MACTripleDES
RIPEMD160
Lägg till validering på Get-*
cmdletar där skickande $null returnerar alla objekt i stället för fel
Om du skickar $null
till något av följande genereras nu ett fel:
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 W3C Extended Log File Format i Import-Csv
Tidigare kan cmdleten Import-Csv
inte användas för att direkt importera loggfilerna i W3C utökat loggformat och ytterligare åtgärder krävs. Med den här ändringen stöds W3C-utökat loggformat.
Import-Csv
PSTypeNames
gäller vid import när typinformation finns i CSV
Tidigare behöll objekt som exporterades med Export-CSV
importerade med ConvertFrom-Csv
TypeInformation
inte 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 skulle -LiteralPath
ett jokertecken 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
är literal, så om filen inte finns bör det fel. Ändring är att behandla jokertecken som används med -Literal
som literal.
Gruppobjekt 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 beslutade 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 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 i Windows som heter more
den omslutna more.com
. 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 Set-Location
eller cd
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>
cd
cd --
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ändaromfattning.
Where-Object -Not
Med tillägget av -Not
parametern till Where-Object
kan 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-WebRequest
stöder nu endast grundläggande HTML-parsning.Invoke-WebRequest
returnerar alltid ettBasicHtmlWebResponseObject
objekt. EgenskapernaParsedHtml
ochForms
har tagits bort.BasicHtmlWebResponseObject.Headers
värden är nuString[]
i ställetString
för .BasicHtmlWebResponseObject.BaseResponse
är nu ettSystem.Net.Http.HttpResponseMessage
objekt.- Egenskapen
Response
för web-cmdlet-undantag är nu ettSystem.Net.Http.HttpResponseMessage
objekt. - Strikt RFC-rubrikparsning är nu standard för parametern
-Headers
och-UserAgent
. Detta kan kringgås med-SkipHeaderValidation
. file://
ochftp://
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 tillgänglig på macOS.
- Användning av
-Credential
via enhttp://
URI resulterar i ett fel. Använd enhttps://
URI eller ange parametern-AllowUnencryptedAuthentication
för att förhindra felet. -MaximumRedirection
skapar 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 som standard till UTF-8-kodning 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-json
svar - Parametern har lagts
-SkipHeaderValidation
till för att tillåtaContent-Type
rubriker som inte är standardkompatibla - Parametern har lagts
-Form
till för att stödja förenklatmultipart/form-data
stöd - Kompatibel, skiftlägeskä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 bara null
Invoke-RestMethod
returnerar serialiserades detta som strängen "null"
i stället $null
för . 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 autentiseringsuppgifter skickas osäkert. Användare 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-cmdletarna 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.
Har 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 kunde du använda de äldre RunspaceConfiguration
eller nyare InitialSessionState
klasserna. Den här ändringen tog bort stöd för RunspaceConfiguration
och stöder InitialSessionState
endast .
CommandInvocationIntrinsics.InvokeScript
binda argument till i stället för $input
$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 Windows-versionsversionen, som inte är tillgänglig på plattformar som inte är 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 literal `u
undfly du backticken: ``u
.
Problem med parameterbindning i ValueFromRemainingArguments
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 relaterad till 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
WorkflowInfo
till interna. Vi stöder inte arbetsflöde längre, så det är vettigt att inte tillåta att personer skaparWorkflow
instanser. - Ta bort typen System.Management.Automation.DebugSource eftersom den endast används för arbetsflödesfelsökning.
- Ta bort överlagringen av
SetParent
från den abstrakta klassen Felsökningsprogram som endast används för arbetsflödesfelsökning. - Ta bort samma överlagring av
SetParent
frå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 princip upp
PSObject
.PSObject
Så är onödig. - När ombudets returtyp är
object
, omsluts den i enPSObject
vilket 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 Basic Auth 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 ä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 pwsh.exe
i PATH
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. 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ägg 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äng:
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 innehåller os-namn, 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 välja bort den här telemetrin anger du miljövariabeln POWERSHELL_TELEMETRY_OPTOUT
till true
, yes
eller 1
. Vi stöder inte längre borttagning av filen DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY
för att inaktivera telemetri.