Rozdíly mezi Windows PowerShellem 5.1 a PowerShellem 7.x

Windows PowerShell 5.1 je založený na rozhraní .NET Framework verze 4.5. Ve verzi PowerShellu 6.0 se PowerShell stal open source projektem založeným na .NET Core 2.0. Přechod z architektury .NET na .NET Core umožnil PowerShellu stát se multiplatformním řešením. PowerShell běží na Windows, macOS a Linuxu.

Mezi Windows PowerShellem a PowerShellem existuje málo rozdílů. Nejdůležitější rozdíly jsou v dostupnosti a chování rutin PowerShellu mezi platformami Windows a jinými než Windows a změnami, které vyplývají z rozdílů mezi rozhraním .NET Framework a .NET Core.

Tento článek shrnuje významné rozdíly a zásadní změny mezi Windows PowerShellem a aktuální verzí PowerShellu. Tento souhrn neobsahuje nové funkce ani rutiny, které byly přidány. Ani tento článek nepojedná o tom, co se mezi verzemi změnilo. Cílem tohoto článku je prezentovat aktuální stav PowerShellu a jak se liší od Windows PowerShellu. Podrobnou diskuzi o změnách mezi verzemi a přidáním nových funkcí najdete v článcích Co je nového pro každou verzi.

.NET Framework vs. .NET Core

PowerShell v Linuxu a macOS používá .NET jádro, což je podmnožina celého .NET Frameworku na Microsoft Windows. To je důležité, protože PowerShell poskytuje přímý přístup k základním typům a metodám architektury. V důsledku toho se skripty, které běží na Windows, nemusí spouštět na jiných platformách než Windows kvůli rozdílům v architekturách. Další informace o změnách v .NET Core najdete v tématu Breaking změn migrace z .NET Framework na .NET Core.

Každá nová verze PowerShellu je založená na novější verzi .NET. V .NET může dojít k zásadním změnám, které mají vliv na PowerShell.

  • PowerShell 7.7 – postaveno na .NET 11.0.100-preview.4
  • PowerShell 7.6 – postaveno na .NET 10.0 (LTS)
  • PowerShell 7.5 – postaveno na .NET 9.0
  • PowerShell 7.4 – postaveno na .NET 8.0 (LTS)
  • PowerShell 7.3 – postaveno na .NET 7.0
  • PowerShell 7.2 – postaveno na .NET 6.0 (LTS)
  • PowerShell 7.1 – postaveno na .NET 5.0
  • PowerShell 7.0 – postaveno na .NET Core 3.1 (LTS)
  • PowerShell 6.2 – postaveno na .NET Core 2.1
  • PowerShell 6.1 – postaveno na .NET Core 2.1
  • PowerShell 6.0 – postaveno na .NET Core 2.0

S nástupem .NET Standard 2.0 může PowerShell načíst mnoho tradičních modulů Windows PowerShellu beze změny. PowerShell 7 navíc obsahuje funkci kompatibility powershellu Windows, která umožňuje používat moduly powershellu Windows, které stále vyžadují úplnou architekturu.

Další informace najdete tady:

Mějte na paměti změny metody .NET

I když .NET změny metody nejsou specifické pro PowerShell, můžou ovlivnit vaše skripty, zejména pokud voláte .NET metody přímo. Navíc mohou existovat nová přetížení pro konstruktory. To může mít vliv na způsob vytváření objektů pomocí New-Object nebo [type]::new() metody.

Například .NET přidalo přetížení k metodě [System.String]::Split(), které nejsou k dispozici v .NET Framework 4.5. Následující seznam ukazuje přetížení pro metodu Split() dostupnou v Windows PowerShellu 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)

Následující seznam ukazuje přetížení metody Split() dostupné v PowerShellu 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)

V Windows PowerShellu 5.1 můžete předat znakové pole (char[]) metodě Split() jako string. Metoda rozdělí cílový řetězec v libovolném výskytu znaku v poli. Následující příkaz rozdělí cílový řetězec v Windows PowerShellu 5.1, ale ne v PowerShellu 7:

# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333

Chcete-li vytvořit vazbu na správné přetížení, je nutné přetypovat řetězec na pole znaků:

# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333

Moduly se už nedoručují pomocí PowerShellu

Z různých důvodů kompatibility už nejsou v PowerShellu zahrnuté následující moduly.

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

Pracovní postup PowerShellu

Pracovní postup PowerShellu je funkce v Windows PowerShellu, která je založená na Windows Workflow Foundation (WF), která umožňuje vytváření robustních runbooků pro dlouhotrvající nebo paralelizované úlohy.

Vzhledem k nedostatku podpory Windows Workflow Foundation v .NET Core jsme z PowerShell odstranili PowerShell Workflow.

V budoucnu bychom chtěli povolit nativní paralelismus a souběžnost v jazyce PowerShellu bez nutnosti používat pracovní postup PowerShellu.

Pokud je potřeba po restartování operačního systému obnovit skript pomocí kontrolních bodů, doporučujeme použít plánovač úloh ke spuštění skriptu při spuštění operačního systému, ale skript by si potřeboval zachovat svůj vlastní stav (například jeho uchování do souboru).

Cmdlets odebrané z PowerShellu

Pro moduly, které jsou součástí PowerShellu, byly z PowerShellu z různých důvodů kompatibility nebo použití nepodporovaných rozhraní API odebrány následující rutiny.

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

Cmdlety rozhraní WMI v1

Z PowerShellu byly odebrány následující rutiny rozhraní WMI v1:

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

Rutiny modulu CimCmdlets (neboli WMI v2) provádějí stejnou funkci a poskytují nové funkce a přepracovanou syntaxi.

New-WebServiceProxy cmdlet odstraněn

.NET Core nepodporuje rozhraní Windows Communication Framework, které poskytuje služby pro použití protokolu SOAP. Tento cmdlet byl odebrán, protože vyžaduje protokol SOAP.

*-Transaction CMDLETS odstraněny

Tyto cmdlety měly velmi omezené využití. Rozhodli jsme se ukončit podporu pro ně.

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

*-EventLog cmdlety

Kvůli použití nepodporovaných rozhraní API byly *-EventLog cmdlety odebrány z PowerShellu. Get-WinEvent a New-WinEvent jsou k dispozici pro získávání a vytváření událostí na Windows.

Rutiny, které používají Windows Presentation Framework (WPF (Windows Presentation Foundation))

.NET Core 3.1 přidali podporu pro WPF (Windows Presentation Foundation), takže verze PowerShellu 7.0 obnovila následující funkce specifické pro Windows:

  • Cmdlet Show-Command
  • Cmdlet Out-GridView
  • Parametr ShowWindow pro Get-Help

Změny v PowerShell Desired State Configuration (DSC)

Invoke-DscResource byla obnovena jako experimentální funkce v PowerShellu 7.0.

Od PowerShellu 7.2 se modul PSDesiredStateConfiguration odebral z PowerShellu a publikoval se do Galerie prostředí PowerShell. Další informace najdete v oznámení na blogu týmu PowerShellu.

Spustitelné změny PowerShellu

Přejmenování powershell.exe na pwsh.exe

Binární název powershellu byl změněn z powershell(.exe) na pwsh(.exe). Tato změna poskytuje deterministický způsob, jak uživatelé spouštět PowerShell na počítačích a podporovat souběžné instalace Windows PowerShellu a PowerShellu.

Další změny na pwsh(.exe) z powershell.exe:

  • První polohový parametr byl změněn z -Command na .-File Tato změna opravuje použití #! (známý jako shebang) ve skriptech PowerShellu, které jsou spouštěny z prostředí mimo PowerShell na ne-Windows platformách. Také to znamená, že můžete spouštět příkazy jako pwsh foo.ps1, pwsh fooScript nebo bez specifikace -File. Tato změna však vyžaduje, abyste explicitně zadali -c nebo -Command při pokusu o spuštění příkazů jako pwsh.exe -Command Get-Command.
  • pwsh přijímá přepínač -i (nebo -Interactive), která označuje interaktivní prostředí. To umožňuje použití PowerShellu jako výchozího prostředí na platformách Unix.
  • Odstraněny parametry -ImportSystemModules a -PSConsoleFile z pwsh.exe.
  • Změnili jsme pwsh -Version a vestavěnou nápovědu pro pwsh.exe tak, aby sladily s ostatními nativními nástroji.
  • Chybové zprávy neplatného argumentu pro -File a -Command a ukončovací kódy konzistentní se standardy Unixu
  • Přidání parametru -WindowStyle na Windows Podobně aktualizace instalací založených na balíčcích na jiných platformách než Windows jsou místní aktualizace.

Zkrácený název je také shodný s pojmenováním shellů na platformách, které nejsou Windows.

Podpora spouštění skriptu PowerShellu s booleovským parametrem

Předtím neexistoval způsob, jak pomocí pwsh.exe spustit skript PowerShell a použít -File pro předání $true/$false jako hodnot parametrů. Byla přidána podpora $true/$false hodnot jako parsovaných parametrů. Podporují se také hodnoty přepínače.

Vylepšená zpětná kompatibilita s Windows PowerShellem

Pro Windows se do [switch] přidá nový parametr Import-Module. Tento parametr vytvoří v PowerShellu 7 modul proxy, který k implicitnímu spuštění všech rutin obsažených v tomto modulu používá místní Windows proces PowerShellu. Další informace najdete v tématu Import-Module .

Další informace o tom, které moduly Microsoft pracují s PowerShellem 7.0, najdete v tabulce kompatibility modulu Module.

podpora Microsoft Update pro Windows

PowerShell 7.2 přidal podporu pro Microsoft Update. Když tuto funkci povolíte, získáte nejnovější aktualizace PowerShellu 7 v tradičním toku správy služba Windows Update (WU), ať už se jedná o služba Windows Update pro firmy, WSUS, SCCM nebo interaktivní dialogové okno WU v Nastavení.

Balíček PowerShell 7.2 MSI obsahuje následující možnosti příkazové řádky:

  • USE_MU – Tato vlastnost má dvě možné hodnoty:
    • 1 (výchozí) – Vybere možnost aktualizace prostřednictvím služby Microsoft Update nebo WSUS
    • 0 – Nezařazujte se do aktualizace prostřednictvím služby Microsoft Update nebo WSUS
  • ENABLE_MU
    • 1 (výchozí) – Volí použití Microsoft Update, Automatické aktualizace nebo služba Windows Update
    • 0 – Nevolte používání Microsoft Update, Automatických aktualizací, nebo služba Windows Update

Změny stroje

Podpora PowerShellu jako výchozího prostředí Unix

V unixu je to konvence pro prostředí, které přijímají -i pro interaktivní prostředí a mnoho nástrojů toto chování očekává (script například a při nastavování PowerShellu jako výchozího prostředí) a volá prostředí s přepínačem -i . Tato změna narušuje skutečnost, že -i dříve mohla být použita jako zkratka pro srovnávání -InputFormat, což nyní musí být -in.

Vlastní moduly snap-in

Moduly snap-in PowerShellu jsou předchůdcem modulů PowerShellu, které nemají v komunitě PowerShellu rozšířené přijetí.

Vzhledem ke složitosti podpory modulů snap-in a jejich nedostatečného využití v komunitě už nepodporujeme vlastní moduly snap-in v PowerShellu.

Příznaky experimentálních funkcí

Podpora v PowerShell 6.2 pro Experimental Features byla umožněna. Vývojáři PowerShellu tak můžou doručovat nové funkce a získat zpětnou vazbu před dokončením návrhu. Tímto způsobem se vyhneme zásadním změnám při vývoji návrhu.

Použijte Get-ExperimentalFeature pro získání seznamu dostupných experimentálních funkcí. Tyto funkce můžete povolit nebo vypnout pomocí Enable-ExperimentalFeature a Disable-ExperimentalFeature.

Načtení sestavení ze základní cesty modulu před pokusem o načtení z GAC

Dříve, když měl binární modul sestavení v GAC, načítali jsme toto sestavení z GAC před tím, než jsme se ho pokusili načíst ze základní cesty modulu.

Přeskočit kontrolu prvku null u kolekcí s typem prvku value-type

Pro parametr Mandatory a atributy ValidateNotNull a ValidateNotNullOrEmpty přeskočte kontrolu null-elementu, pokud je typ prvku kolekce typem hodnoty.

Zachovat $? pro ParenExpression, SubExpression a ArrayExpression

Tento PR mění způsob, jakým kompilujeme dílčí pipeline (...), dílčí výrazy $(...) a pole výrazů @(), aby $? nebylo automaticky pravdivé. Místo toho hodnota $? závisí na výsledku spuštění kanálu nebo příkazů.

Oprava $?, aby nebyl $false, když nativní příkaz zapisuje do stderr.

$? není nastavena na $false při zápisu nativního příkazu do stderr. Nativní příkazy často zapisují do stderr bez úmyslu signalizovat selhání. $? je nastaveno pouze na $false pokud má nativní příkaz nenulový ukončovací kód.

Zajistit, aby $ErrorActionPreference neovlivňoval výstup stderr nativních příkazů

Nativní příkazy často zapisují do stderr bez úmyslu signalizovat selhání. S touto změnou je stderr výstup stále zachycen v objektech ErrorRecord, ale runtime již neplatí $ErrorActionPreference, pokud ErrorRecord pochází z nativního příkazu.

Změňte $OutputEncoding na použití UTF-8 NoBOM kódování místo ASCII.

Předchozí kódování ASCII (7bitová verze) by v některých případech vedlo k nesprávné změně výstupu. Nastavení UTF-8 NoBOM výchozího nastavení zachovává výstup Unicode s kódováním podporovaným většinou nástrojů a operačních systémů.

Upravte cmdlety s parametrem -Encoding tak, aby byly typu System.Text.Encoding

Hodnota -EncodingByte byla odebrána z cmdletů zprostředkovatele FileSystem. Nový parametr -AsByteStream se nyní používá k určení, zda je jako vstup vyžadován tok bajtů, nebo zda je výstup proud bajtů.

Změna kódování New-ModuleManifest na UTF8NoBOM na platformách, které nejsou Windows

New-ModuleManifest Dříve vytvořil psd1 manifesty v UTF-16 se znakem pořadí bajtů, což způsobilo problém pro linuxové nástroje. Tato změna způsobující chybu změní kódování New-ModuleManifest na UTF (bez BOM) v jiných platformách než Windows.

Odebrání AllScope z většiny výchozích aliasů

Aby se urychlilo vytváření rozsahu, AllScope bylo odstraněno z většiny výchozích aliasů. AllScope zůstalo u několika často používaných aliasů, kde bylo vyhledávání rychlejší.

-Verbose a -Debug již nepřepisují $ErrorActionPreference

Dříve, pokud byl specifikován -Verbose nebo -Debug, přehlasoval chování $ErrorActionPreference. S touto změnou -Verbose a -Debug již neovlivňuje chování $ErrorActionPreference.

-Debug Dále se parametr nastaví na $DebugPreference místo na Inquire.

Zajistit, aby $PSCulture důsledně odrážely změny kulturního kontextu během relace.

Ve Windows PowerShellu je aktuální hodnota národního prostředí uložena do mezipaměti, což může způsobit, že hodnota nebude synchronizována s prostředím, pokud se změní po spuštění relace. Toto chování při ukládání do mezipaměti je opravené v jádru PowerShellu.

Povolit explicitně zadaný pojmenovaný parametr nahradit stejný parametr z hashtable splatting

Při této změně se pojmenované parametry ze splattingu přesunou na konec seznamu parametrů, aby byly svázané po všech explicitně zadaných pojmenovaných parametrech. Vazby parametrů pro jednoduché funkce nevyvolají chybu, pokud zadaný pojmenovaný parametr nelze najít. Neznámé pojmenované parametry jsou vázány na $args parametr jednoduché funkce. Přesun splattingu na konec seznamu argumentů mění pořadí, v jakém se parametry objevují v $args.

Například:

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

V předchozím chování není myPath vázán -Path , protože se jedná o třetí argument v seznamu argumentů. ## Takže to nakonec skončí nacpané do '$args' spolu s Blah = "World"

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

S touto změnou jsou argumenty z @hash přesunuty na konec seznamu argumentů. MyPath se stane prvním argumentem v seznamu, takže je vázán na -Path.

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

Změny jazyka

Operátor nulového sloučení ??

Operátor ?? nulového sloučení vrátí hodnotu levého operandu, pokud není nulový. V opačném případě vyhodnocuje pravý operand a vrátí výsledek. Operátor ?? nevyhodnocuje svůj pravý operand, pokud se levý operand vyhodnotí jako nenulový.

$x = $null
$x ?? 100
100

V následujícím příkladu nebude vyhodnocen pravý operand.

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Operátor přiřazení při slučování s hodnotou null ??=

Operátor přiřazení s nulovým sloučením ??= přiřadí hodnotu svého pravého operandu svému levému operandu pouze tehdy, pokud se levý operand vyhodnotí jako null. Operátor ??= nevyhodnocuje svůj pravý operand, pokud se levý operand vyhodnotí jako nenulový.

$x = $null
$x ??= 100
$x
100

V následujícím příkladu nebude vyhodnocen pravý operand.

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020

Podmíněné operátory s hodnotou Null

Poznámka:

Tato funkce byla přesunuta z experimentálního do hlavního proudu v PowerShellu 7.1.

Podmíněný operátor s hodnotou null aplikuje na svůj operand operaci přístup člena nebo ?.elementu ?[]pouze v případě, že se tento operand vyhodnotí jako nenulový. V opačném případě vrátí hodnotu null.

Vzhledem k tomu, že PowerShell umožňuje ? být součástí názvu proměnné, je pro použití těchto operátorů vyžadována formální specifikace názvu proměnné. Takže je nutné používat {} kolem názvů proměnných, například ${a} když ? je součástí názvu ${a?}proměnné.

V následujícím příkladu se vrátí hodnota PropName .

$a = @{ PropName = 100 }
${a}?.PropName
100

Následující příklad vrátí hodnotu null bez pokusu o přístup k názvu člena PropName.

$a = $null
${a}?.PropName

Podobně bude vrácena hodnota prvku.

$a = 1..10
${a}?[0]
1

A když je operand null, prvek není přístupný a vrátí se hodnota null.

$a = $null
${a}?[0]

Poznámka:

Názvosloví proměnné ${<name>} by nemělo být zaměňováno s operátorem dílčího výrazu $(). Další informace naleznete v části Název proměnné about_Variables.

Přidání & operátoru pro řízení úloh

Umístění & na konec potrubí způsobí, že potrubí běží jako úloha PowerShellu. Když je pipelina načtena jako proces na pozadí, vrátí se objekt úlohy. Jakmile pipeline běží jako úloha, lze ke správě úlohy použít všechny standardní *-Job cmdlety. Proměnné (bez ohledu na procesově specifické proměnné) používané v pipeline se automaticky kopírují do úlohy, takže Copy-Item $foo $bar & to prostě funguje. Úloha se také spustí v aktuálním adresáři místo domovského adresáře uživatele.

Nové metody/vlastnosti na PSCustomObject

Přidali jsme nové metody a vlastnosti do PSCustomObject. PSCustomObject nyní zahrnuje vlastnost Count/Length jako jiné objekty.

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

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Tato práce také zahrnuje metody ForEach a Where, které vám umožní pracovat s položkami PSCustomObject a filtrovat na nich.

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

Převody z PSMethod na delegáta

Můžete převést PSMethod na delegáta. To vám umožní například předat PSMethod[M]::DoubleStrLen hodnotu delegáta do [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)

Chování porovnání řetězců se změnilo v PowerShellu 7.1

PowerShell 7.1 je založený na .NET 5.0, který zavedl následující zásadní změnu:

Od verze .NET 5.0 ignorují porovnání řetězců, které neberou ohled na kulturu, netisknutelné řídicí znaky.

Například následující dva řetězce jsou považovány za totožné:

# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True

Nové rutiny

Nový Get-Uptime cmdlet

Rutina Get-Uptime vrátí čas uplynulý od posledního spuštění operačního systému. Cmdlet byl představen v PowerShellu 6.0.

Nový Remove-Alias cmdlet

Rutina Remove-Alias odebere alias z aktuální relace PowerShellu. Cmdlet byl představen v PowerShellu 6.0.

Nový Remove-Service cmdlet

Rutina Remove-Service odebere službu Windows v registru a v databázi služby. Cmdlet Remove-Service byl představen v PowerShellu 6.0.

Nové rutiny Markdownu

Markdown je standard pro vytváření čitelných dokumentů ve formátu prostého textu se základním formátováním, které lze vykreslit do HTML.

V PowerShellu 6.1 byly přidány následující rutiny:

  • ConvertFrom-Markdown – Převede obsah řetězce nebo souboru na objekt MarkdownInfo.
  • Get-MarkdownOption – vrátí aktuální barvy a styly použité k vykreslení obsahu Markdownu v konzole.
  • Set-MarkdownOption – Nastaví barvy a styly používané k vykreslení obsahu Markdownu v konzole.
  • Show-Markdown – zobrazí obsah Markdownu v konzole nebo ve formátu HTML.

Nový Test-Json cmdlet

Rutina Test-Json testuje, jestli je řetězec platným dokumentem JSON (JavaScript Object Notation) a může volitelně ověřit, že dokument JSON odpovídá zadanému schématu.

Tato rutina byla představena v PowerShellu 6.1.

Nové rutiny pro podporu experimentálních funkcí

V PowerShellu 6.2 byly přidány následující rutiny pro podporu experimentálních funkcí.

Nový Join-String cmdlet

Rutina Join-String kombinuje objekty z pipelinu do jednoho řetězce. Tento cmdlet byl přidán v PowerShellu 6.2.

Nové zobrazení ConciseView a cmdlet Get-Error

PowerShell 7.0 vylepšuje zobrazení chybových zpráv, aby se zlepšila čitelnost interaktivních chyb a chyb skriptů pomocí nového výchozího zobrazení ConciseView. Pohledy jsou uživatelsky vybírovatelné pomocí preferencní proměnné $ErrorView.

S ConciseView, pokud chyba není způsobena chybou skriptu nebo parseru, je to jednořádková chybová zpráva:

Get-ChildItem -Path C:\NotReal
Get-ChildItem: Can't find path 'C:\NotReal' because it doesn't exist

Pokud k chybě dojde při provádění skriptu nebo je to chyba analýzy, PowerShell vrátí víceřádkovou chybovou zprávu, která obsahuje chybu, ukazatel a chybovou zprávu s informacemi o tom, kde se chyba nachází na tomto řádku. Pokud terminál nepodporuje ANSI barevné únikové sekvence (VT100), barvy se nezobrazují.

Výchozí zobrazení v PowerShell 7 je ConciseView. Předchozí výchozí zobrazení bylo NormalView a můžete ho zvolit nastavením preference proměnné $ErrorView.

$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView

Poznámka:

Je přidána nová vlastnost ErrorAccentColor do $Host.PrivateData, která podporuje změnu barvy akcentu chybové zprávy.

Nový Get-Errorcmdlet poskytuje úplné podrobné zobrazení plně kvalifikované chyby dle potřeby. Ve výchozím nastavení cmdlet zobrazuje všechny detaily, včetně vnitřních výjimek, poslední chyby, která nastala.

Cmdlet Get-Error podporuje vstup z pipeline pomocí vestavěné proměnné $Error. Get-Error zobrazuje všechny chyby v potrubí.

$Error | Get-Error

Cmdlet Get-Error podporuje parametr Nejnovější , což vám umožňuje určit, kolik chyb z aktuální relace chcete, aby se zobrazovalo.

Get-Error -Newest 3 # Displays the lst three errors that occurred in the session

Další informace naleznete v tématu Get-Error.

Změny cmdletů

Bylo přidáno paralelní spuštění do ForEach-Object

Počínaje PowerShellem 7.0 má rutina ForEach-Object, která iteruje položky v kolekci, nyní integrované paralelní zpracování s novým parametrem Parallel.

Ve výchozím nastavení paralelní skriptové bloky používají aktuální pracovní adresář volajícího, který paralelní úkoly zahájil.

Tento příklad načte 50 000 položek protokolu z 5 systémových protokolů na místním počítači Windows:

$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

Parametr Parallel specifikuje blok skriptu, který běží paralelně pro každý název vstupního logu.

Nový parametr ThrottleLimit omezuje počet bloků skriptů běžících paralelně v daném okamžiku. Výchozí hodnota je 5.

Použijte proměnnou $_ k reprezentaci aktuálního vstupního objektu ve skriptním bloku. Pomocí modifikátoru Using: oboru můžete předat odkazy na proměnné do bloku spuštěného skriptu.

Další informace naleznete v tématu ForEach-Object.

Zkontrolujte, jestli existují kompatibilní vestavěné moduly pro Windows na system32

V aktualizaci Windows 10 1809 a Windows Server 2019 jsme aktualizovali řadu integrovaných modulů PowerShellu, aby je označili jako kompatibilní s PowerShellem.

Při spuštění $windir\System32 PowerShellu se automaticky zahrne jako součást proměnné prostředí PSModulePath. Moduly však vystavuje pouze do Get-Module a Import-Module, pokud je jeho CompatiblePSEdition označen jako kompatibilní s Core.

Toto chování můžete přepsat, aby se všechny moduly zobrazovaly pomocí parametru -SkipEditionCheck[switch] . Do výstupu tabulky jsme také přidali vlastnost PSEdition .

-lp alias pro všechny -LiteralPath parametry

Vytvořili jsme standardní alias -lp parametru pro všechny integrované rutiny PowerShellu -LiteralPath , které mají parametr.

Opravte Get-Item -LiteralPath a*b, pokud a*b ve skutečnosti neexistuje, aby vrátila chybu.

Dříve -LiteralPath zacházela se zástupným znakem stejně jako -Path, a pokud zástupný znak nenašel žádné soubory, tiše ukončila. Správné chování by mělo být, že -LiteralPath je doslovný, takže pokud soubor neexistuje, mělo by dojít k chybě. Změna spočívá v tom, že se zástupné znaky používané s -Literal budou považovat za doslovné.

Nastavení pracovního adresáře na aktuální adresář v adresáři Start-Job

Cmdlet Start-Job teď používá aktuální adresář jako pracovní adresář pro nový úkol.

Odebrat -Protocol z *-Computer cmdletů

Parametr -Protocol byl odebrán z následujících rutin:

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

DCOM již není podporováno pro vzdálené volání. Tyto rutiny podporují pouze vzdálené spojení WSMAN.

Odebrat -ComputerName z *-Service cmdletů

Aby se podpořilo konzistentní používání PSRP, byl tento -ComputerName parametr odstraněn z *-Service cmdletů. Použijte Invoke-Command ke spuštění příkazových rutin na vzdálených počítačích.

Oprava Get-Content -Delimiter tak, aby neobsahoval oddělovač ve vrácených řádcích

Dříve byl výstup při používání Get-Content -Delimiter nekonzistentní a nepohodlný, protože bylo potřeba dalšího zpracování dat k odstranění oddělovače. Tato změna odebere oddělovač z vrácených řádků.

Změny v Format-Hex

Parametr -Raw teď nic nedělá. Cmdlet Format-Hex zobrazí skutečnou reprezentaci čísel, která zahrnuje všechny bajty daného typu. Toto je to, co -Raw parametr provedl před touto změnou.

Oprava překlepu v Get-ComputerInfo názvu vlastnosti

BiosSerialNumber bylo chybně napsáno a BiosSeralNumber bylo změněno na správný pravopis.

Změny dostupných hashovacích algoritmů

Z .NET byly odebrány následující hashovací algoritmy:

  • MACTripleDES
  • RIPEMD160

Tato změna má vliv na příkaz Get-FileHash.

Přidání ověřování do Get-* rutin, kde předávání $null vrací všechny objekty místo chyby

Předání $null kterémukoli z následujících nyní vyvolá chybu:

  • 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

Přidejte podporu pro formát rozšířeného souboru protokolu W3C v Import-Csv

Dříve se Import-Csv rutina nemohla použít k přímému importu souborů protokolu v rozšířeném formátu protokolu W3C a byla vyžadována další akce. Podpora rozšířeného formátu protokolu W3C je zahrnuta v této změně.

Import-Csv se použije pstypenames při importu, pokud jsou v souboru CSV k dispozici informace o typu.

Dříve se objekty exportované pomocí Export-Csv s TypeInformation importované pomocí ConvertFrom-Csv nezachovávaly informace o typu. Tato změna přidává informace o typu člena pstypenames , pokud je dostupný ze souboru CSV.

-NoTypeInformation je ve výchozím nastavení na Export-Csv

Dříve rutina Export-Csv vypisovala komentář jako první řádek, který obsahoval název typu objektu. Tato změna standardně vylučuje informace o typu, protože jim většina nástrojů CSV nerozumí. Tato změna byla provedena, aby se vyřešila zpětná vazba zákazníků.

Použijte -IncludeTypeInformation k zachování předchozího chování.

Povolit použití * v cestě registru pro Remove-Item

Dříve -LiteralPath zacházela se zástupným znakem stejně jako -Path, a pokud zástupný znak nenašel žádné soubory, tiše ukončila. Správné chování by mělo být, že -LiteralPath je doslovný, takže pokud soubor neexistuje, mělo by dojít k chybě. Změna spočívá v tom, že se zástupné znaky používané s -Literal budou považovat za doslovné.

Group-Object teď seřadí skupiny.

V rámci zlepšení výkonu nyní vrací Group-Object seřazený seznam skupin. I když byste neměli spoléhat na pořadí, tato změna by vás mohla zasáhnout, pokud byste chtěli první skupinu. Rozhodli jsme se, že toto zlepšení výkonu stojí za změnu, protože dopad, který je závislý na předchozím chování, je nízký.

Směrodatná odchylka v Measure-Object

Výstup z Measure-Object nyní nově obsahuje vlastnost StandardDeviation.

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 nyní má parametr Password, který přebírá SecureString. To vám umožní používat neinteraktivně:

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

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

Odstranění more funkce

PowerShell v minulosti odeslal funkci na Windows s názvem more zabalenou more.com. Tato funkce byla nyní odebrána.

Funkce help se také změnila tak, aby používala more.com na Windows nebo výchozí stránkovač určený systémem $Env:PAGER na ostatních platformách než Windows.

cd DriveName: Nyní se uživatelé vrátí do aktuálního pracovního adresáře na tomto disku

Dříve použití příkazů Set-Location nebo cd k návratu na PSDrive posílalo uživatele na výchozí umístění tohoto disku. Uživatelé jsou nyní přesměrováni do posledního pracovního adresáře v rámci relace.

cd - se vrátí do předchozího adresáře

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

Nebo v Linuxu:

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

Také cd a cd -- změňte na $HOME.

Update-Help jako uživatel bez administrátorských práv

Na základě oblíbenosti Update-Help už nemusí být spouštěn jako administrátor. Update-Help Nyní se nápověda ukládá do uživatelské složky.

Where-Object -Not

Přidáním parametru -Not do Where-Object lze v potrubí filtrovat objekt podle neexistující vlastnosti nebo vlastnosti s hodnotou null či prázdnou.

Tento příkaz například vrátí všechny služby, které nemají definované žádné závislé služby:

Get-Service | Where-Object -Not DependentServices

Změny webových Cmdletů

Základní rozhraní API .NET pro webové cmdlety se změnilo na System.Net.Http.HttpClient. Tato změna přináší mnoho výhod. Tato změna ale spolu s nedostatkem interoperability s Internet Explorer způsobila několik zásadních změn v rámci Invoke-WebRequest a Invoke-RestMethod.

  • Invoke-WebRequest nyní podporuje pouze základní HTML parsování. Invoke-WebRequest vždy vrátí BasicHtmlWebResponseObject objekt. Byly odstraněny vlastnosti ParsedHtml a Forms.
  • BasicHtmlWebResponseObject.Headers hodnoty jsou nyní String[] místo String.
  • BasicHtmlWebResponseObject.BaseResponse je nyní System.Net.Http.HttpResponseMessage objektem.
  • Vlastnost Response na výjimkách Web Cmdlet je nyní System.Net.Http.HttpResponseMessage objekt.
  • Přísné parsování RFC hlaviček je nyní výchozím nastavením pro parametr -Headers a -UserAgent. To lze obejít pomocí -SkipHeaderValidation.
  • file:// a ftp:// schémata URI již nejsou podporována.
  • System.Net.ServicePointManager Nastavení již nejsou ctěna.
  • V systému macOS aktuálně není k dispozici ověřování založené na certifikátech.
  • Použití -Credential přes http:// URI povede k chybě. Použijte https:// URI nebo zadejte -AllowUnencryptedAuthentication parametr k potlačení chyby.
  • -MaximumRedirection nyní generuje kritickou chybu, pokud pokusy o přesměrování překročí stanovený limit, místo toho, aby vrátil výsledky posledního přesměrování.
  • V PowerShellu 6.2 došlo ke změně ve výchozím nastavení kódování UTF-8 pro odpovědi JSON. Pokud pro odpověď JSON není zadána znaková sada, mělo by být výchozí kódování UTF-8 na RFC 8259.
  • Výchozí kódování nastavené na UTF-8 pro application-json odpovědi
  • Přidání -SkipHeaderValidation parametru pro povolení Content-Type hlaviček, které nedodržují standardy
  • Přidání -Form parametru pro podporu zjednodušené multipart/form-data podpory
  • Souladné zpracování relačních klíčů bez rozlišování velkých a malých písmen
  • Přidán parametr -Resume pro webové cmdlety

Invoke-RestMethod vrátí užitečné informace, pokud se nevrátí žádná data.

Když rozhraní API vrátí pouze null, Invoke-RestMethod to serializovalo jako řetězec "null" místo $null. Tato změna opravuje logiku v Invoke-RestMethod pro správnou serializaci platného jednohodnotového JSON null literálu jako $null.

Webové cmdlety varují, když je -Credential odesílán přes nešifrovaná připojení

Při použití protokolu HTTP se obsah včetně hesel odešle jako prostý text. Tato změna ve výchozím nastavení toto nepovolí a vrátí chybu, pokud se přihlašovací údaje předávají nezabezpečeným způsobem. Uživatelé to mohou obejít pomocí spínače -AllowUnencryptedAuthentication .

Nastavení -OutFile parametru ve webových rutinách tak, aby fungoval jako -LiteralPath

Počínaje PowerShell 7.1 funguje parametr OutFile u webových cmdletů jako LiteralPath a nezpracovává zástupné znaky.

Změny rozhraní API

Odebrat AddTypeCommandBase třídu

Třída AddTypeCommandBase byla odstraněna z Add-Type pro zlepšení výkonu. Třídu Add-Type používá pouze cmdlet a neměla by mít vliv na uživatele.

Odstraněno VisualBasic jako podporovaný jazyk v Add-Type

V minulosti byste mohli kód Visual Basic zkompilovat pomocí rutiny Add-Type. Visual Basic se zřídka používaly s Add-Type. Tuto funkci jsme odebrali, abychom zmenšili velikost PowerShellu.

RunspaceConfiguration Podpora byla odebrána

Dříve jste při programovém vytváření prostředí Runspace PowerShellu pomocí rozhraní API mohli použít starší RunspaceConfiguration nebo novější InitialSessionState třídy. Tato změna odstranila podporu pro RunspaceConfiguration a podpora zůstává pouze pro InitialSessionState.

CommandInvocationIntrinsics.InvokeScriptsvázat argumenty s $input místo $args

Nesprávná pozice parametru způsobila, že args byly předány jako vstupní argumenty místo jako args.

Odeberte vlastnosti ClrVersion a BuildVersion z $PSVersionTable

Vlastnost ClrVersion$PSVersionTable není užitečná s CoreCLR. Koncoví uživatelé by k určení kompatibility neměli používat danou hodnotu.

Vlastnost BuildVersion byla svázaná s verzí sestavení Windows, která není k dispozici na platformách, které nejsou Windows. Použijte vlastnost GitCommitId pro získání přesné verze sestavení PowerShellu.

Implementace parsování Unicode escape sekvencí

`u#### nebo `u{####} je převedeno na odpovídající znak Unicode. Pro výstup literálu `uunikněte zpětnému ticku: ``u.

Problém s vazbou parametrů ve ValueFromRemainingArguments funkcích PS

ValueFromRemainingArguments nyní vrací hodnoty jako pole místo jedné hodnoty, která je sama pole.

Vyčistili jsme použití CommandTypes.Workflow a WorkflowInfoCleaned

Vyčistěte kód související s používáním CommandTypes.Workflow a WorkflowInfo v system.Management.Automation.

Tyto menší zásadní změny mají vliv hlavně na kód zprostředkovatele nápovědy.

  • Změňte veřejné konstruktory WorkflowInfo na interní. Pracovní postup už nepodporujeme, takže je vhodné nepovolit uživatelům vytvářet Workflow instance.
  • Odeberte typ System.Management.Automation.DebugSource , protože se používá jenom pro ladění pracovního postupu.
  • Odeberte přetížení SetParent z abstraktní třídy Debugger, která se používá pouze pro ladění pracovního postupu.
  • Odeberte stejné přetížení SetParent z odvozené třídy RemotingJobDebugger.

Neobalovat výsledek vrácení PSObject když se ScriptBlock převádí na delegáta

Když je a ScriptBlock převedeno na typ delegáta pro použití v kontextu C#, zabalení výsledku do a PSObject přináší zbytečné potíže:

  • Když je hodnota převedena na návratový typ delegáta, je v podstatě PSObject odstraněn. Takže to PSObject není potřeba.
  • Když je typ návratu delegáta object zabalen do PSObject, a tím se ztěžuje práce v kódu C#.

Po této změně je vrácený objekt základním objektem.

Podpora vzdáleného připojení

Vzdálené ovládání PowerShellu (PSRP) pomocí WinRM není podporováno pro platformy jiné než Windows. Pomocí vzdálené komunikace PowerShellu (PSRP) přes WinRM z Windows se můžete připojit k dalším počítačům Windows. PowerShell také podporuje vzdálené komunikace přes SSH na všech platformách (Windows, macOS a Linux). Další informace najdete v tématu Vzdálená správa SSH v PowerShellu.

PowerShell Direct for Containers se pokusí použít pwsh jako první

PowerShell Direct je funkce PowerShellu a Hyper-V, která umožňuje připojení k virtuálnímu počítači Hyper-V nebo kontejneru bez připojení k síti nebo jiných služeb pro vzdálenou správu.

PowerShell Direct se v minulosti připojil pomocí integrované instance Windows PowerShellu v kontejneru. PowerShell Direct se nejprve pokusí připojit pomocí jakékoli dostupné pwsh.exe proměnné PATH prostředí. Pokud pwsh.exe není dostupný, PowerShell Direct se vrací k použití powershell.exe.

Enable-PSRemoting Nyní vytváří samostatná vzdálená připojovací místa pro náhledové verze

Enable-PSRemoting Nyní vytváří dvě konfigurace vzdálených relací:

  • Jedna pro hlavní verzi PowerShellu. Například: PowerShell.6. Tento koncový bod, na který se lze spolehnout během aktualizací menších verzí, jako konfiguraci relace PowerShell 6 pro systém jako celek.
  • Jedna verze-specifická konfigurace relace, například: PowerShell.6.1.0

Toto chování je užitečné, pokud chcete mít na stejném počítači nainstalovaných a přístupných více verzí PowerShellu 6.

Navíc náhledové verze PowerShellu nyní po spuštění Enable-PSRemoting cdletu dostávají vlastní konfigurace vzdálených relací:

C:\WINDOWS\system32> Enable-PSRemoting

Pokud jste ještě nenastavili WinRM, může se výstup lišit.

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

Pak můžete zobrazit samostatné konfigurace relací PowerShellu pro verze Preview a stabilní sestavení PowerShellu 6 a pro každou konkrétní verzi.

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 podporovaná pro SSH

Klienti SSH obvykle podporují připojovací řetězec ve formátu user@host:port. S přidáním protokolu SSH jako protokolu pro vzdálené komunikace PowerShellu jsme přidali podporu pro tento formát připojovací řetězec:

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

Telemetrie se dá zakázat jenom s proměnnou prostředí.

PowerShell odesílá základní telemetrická data do Microsoft při spuštění. Data zahrnují název operačního systému, verzi operačního systému a verzi PowerShellu. Tato data nám umožňují lépe porozumět prostředím, kde se používá PowerShell, a umožňuje nám určit prioritu nových funkcí a oprav.

Pokud chcete tuto telemetrii zrušit, nastavte proměnnou prostředí POWERSHELL_TELEMETRY_OPTOUT na true, yesnebo 1. Již nepodporujeme smazání souboru DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY pro deaktivaci telemetrie.