Rozdíly ve verzích Windows PowerShellu 5.1 a 7.x

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

V jazyce PowerShellu mezi Prostředím Windows PowerShell a PowerShellem je několik rozdílů. Nejdůležitější rozdíly jsou v dostupnosti a chování rutin PowerShellu mezi platformami Windows a jinými systémy 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 prostředí Windows PowerShell a aktuální verze 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 Prostředí Windows PowerShell. 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 Core, což je podmnožina úplného rozhraní .NET Framework v systému 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ěží ve Windows, nemusí spouštět na platformách jiných než Windows kvůli rozdílům v architekturách. Další informace o změnách v .NET Core najdete v tématu Zásadní změny migrace z rozhraní .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.5 – postaveno na .NET 9.0
  • PowerShell 7.4 – postaveno na .NET 8.0
  • PowerShell 7.3 – postaveno na .NET 7.0
  • PowerShell 7.2 (LTS-current) – postaveno na .NET 6.0 (LTS-current)
  • PowerShell 7.1 – postaveno na .NET 5.0
  • PowerShell 7.0 (LTS) – 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

Po nástupu .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 prostředí Windows PowerShell, která umožňuje používat moduly Windows PowerShellu, které stále vyžadují úplnou architekturu.

Další informace najdete tady:

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

I když změny metod .NET nejsou specifické pro PowerShell, můžou ovlivnit vaše skripty, zejména pokud voláte metody .NET 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 rozhraní .NET přidalo přetížení do [System.String]::Split() metody, které nejsou k dispozici v rozhraní .NET Framework 4.5. Následující seznam ukazuje přetížení metody Split() dostupné v prostředí 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)

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)

Ve Windows PowerShellu 5.1 můžete metodě předat znakové pole (char[]) 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 ve 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é zadat ř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 prostředí Windows PowerShell, která je založená na windows Workflow Foundation (WF), která umožňuje vytváření robustních runbooků pro dlouhotrvající nebo paralelizované úlohy.

Kvůli nedostatku podpory pro Windows Workflow Foundation v .NET Core jsme odebrali pracovní postup PowerShellu z PowerShellu.

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).

Rutiny 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

Rutiny 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 Rutina byla odebrána.

.NET Core nepodporuje rozhraní Windows Communication Framework, které poskytuje služby pro použití protokolu SOAP. Tato rutina byla odebrána, protože vyžaduje protokol SOAP.

*-Transaction Odebrané rutiny

Tyto rutiny 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 Rutin

Kvůli použití nepodporovaných rozhraní API *-EventLog se rutiny z PowerShellu odebraly. Get-WinEvent a New-WinEvent jsou k dispozici pro získání a vytváření událostí ve Windows.

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

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

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

Změny konfigurace požadovaného stavu PowerShellu (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 pwsh(.exe) z powershell.exe:

  • Změna prvního pozičního parametru z -Command na -File. Tato změna opravuje použití #! (neboli jako shebang) ve skriptech PowerShellu, které se spouštějí z prostředí mimo PowerShell na platformách mimo Windows. Také to znamená, že můžete spouštět příkazy jako pwsh foo.ps1 nebo pwsh fooScript bez zadání -File. Tato změna však vyžaduje explicitní zadání -c nebo -Command při pokusu o spuštění příkazů, jako pwsh.exe -Command Get-Commandje .
  • pwsh-i přijme přepínač (nebo-Interactive) označující interaktivní prostředí. To umožňuje použití PowerShellu jako výchozího prostředí na platformách Unix.
  • Odebrané parametry -ImportSystemModules a -PSConsoleFile z pwsh.exe.
  • Změna pwsh -version a integrovaná nápověda pro pwsh.exe sladění s jinými nativními nástroji
  • Neplatné chybové zprávy argumentu pro -File a -Command ukončovací kódy konzistentní se standardy Unixu
  • Přidání -WindowStyle parametru ve Windows Podobně jsou aktualizace instalací založené na balíčcích na jiných platformách než Windows místní aktualizace.

Zkrácený název je také konzistentní s pojmenováním prostředí na platformách jiných než Windows.

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

Dříve použití pwsh.exe ke spuštění powershellového skriptu pomocí -File zadaného způsobu předání $true/$false hodnot parametrů nebylo možné. $true/$false Byla přidána podpora parsovaných hodnot do parametrů. Podporují se také hodnoty přepínače.

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

Pro Windows se přidá nový parametr přepínače UseWindowsPowerShell do Import-Module. Tento přepínač vytvoří v PowerShellu 7 modul proxy, který implicitně spouští všechny rutiny obsažené v tomto modulu pomocí místního procesu Windows PowerShellu. Další informace najdete v tématu Import-Module.

Další informace o tom, které moduly Microsoftu pracují s PowerShellem 7.0, najdete v tabulce kompatibility modulů.

Podpora služby 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í dialog WU v Nastavení.

Balíček MSI PowerShellu 7.2 obsahuje následující možnosti příkazového řádku:

  • USE_MU – Tato vlastnost má dvě možné hodnoty:
    • 1 (výchozí) – Výslovný souhlas s aktualizací prostřednictvím služby Microsoft Update nebo WSUS
    • 0 – Nepřihlašujte se k aktualizaci prostřednictvím služby Microsoft Update nebo WSUS.
  • ENABLE_MU
    • 1(výchozí) – Přihlašuje se k používání služby Microsoft Update pomocí automatického Aktualizace nebo služba Windows Update
    • 0- Nepřihlašujte se k používání služby Microsoft Update automatické Aktualizace nebo služba Windows Update

Změny modulu

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 je v tom, že -i dříve bylo možné použít jako krátkou ruku ke shodě -inputformat, která nyní musí být -in.

Vlastní moduly snap-in

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

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 experimentálních funkcí v PowerShellu 6.2 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.

Umožňuje Get-ExperimentalFeature získat seznam dostupných experimentálních funkcí. Tyto funkce můžete povolit nebo zakázat 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á binární modul sestavení modulu v GAC, načetli jsme sestavení z GAC předtím, než se ho pokusíme načíst ze základní cesty modulu.

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

Mandatory Pro parametr a ValidateNotNullValidateNotNullOrEmpty atributy přeskočte hodnotu null-element zkontrolujte, zda je typ elementu kolekce typ hodnoty.

Zachovat $? pro ParenExpression, SubExpression a ArrayExpression

Tato žádost o přijetí změn mění způsob, jakým kompilujeme dílčípipeliny (...), dílčí výrazy $(...) a maticové výrazy @() tak, aby $? nebyly automaticky pravdivé. Místo toho hodnota $? závisí na výsledku spuštění kanálu nebo příkazů.

Oprava $? , že při $false zápisu nativního příkazu do stderr

$? není nastavena na $false při zápisu nativního příkazu do stderr. Nativní příkazy stderr se dají zapisovat bez úmyslu indikovat selhání. $? je nastavena pouze $false v případech, kdy nativní příkaz obsahuje nenulový ukončovací kód.

Neovlivnit $ErrorActionPreferencestderr výstup nativních příkazů

Nativní příkazy stderr se dají zapisovat bez úmyslu indikovat selhání. Při této změně stderr se výstup stále zaznamenává v objektech ErrorRecord , ale modul runtime již neplatí $ErrorActionPreference , pokud ErrorRecord pochází z nativního příkazu.

Změna $OutputEncoding 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ů.

Sjednocení rutin s parametrem -Encoding typu System.Text.Encoding

Hodnota -EncodingByte byla odebrána z rutin zprostředkovatele systému souborů. Nový parametr , -AsByteStreamje nyní používán k určení, že bajtový datový proud je vyžadován jako vstup nebo že výstup je datový proud bajtů.

Změna New-ModuleManifest kódování na UTF8NoBOM jiných platformách než Windows

New-ModuleManifest Dříve vytvoří psd1 manifesty v UTF-16 s kusovníkem a vytvoří problém pro linuxové nástroje. Tato změna způsobující chybu změní kódování New-ModuleManifest na UTF (bez BOM) na platformách jiných než Windows.

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

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

-Verbose a -Debug už přepisy $ErrorActionPreference

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

-Debug Kromě toho se parametr nastaví $DebugPreference na Continue (Pokračovat) místo inquire (Inquire).

Konzistentně $PSCulture reflektovat změny jazykové verze relace

Ve Windows PowerShellu se aktuální hodnota jazykové verze ukládá do mezipaměti, což může umožnit, aby se hodnota po spuštění relace nesynchronizuje s jazykovou verzí. 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řesunutím splattingu na konec seznamu argumentů se změní pořadí, ve $argskteré se parametry zobrazí .

Příklad:

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

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

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

Při této změně se argumenty ze @hash seznamu argumentů přesunou 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 sjednocení ??

Operátor ?? nulového sjednocení vrátí hodnotu levého operandu, pokud není null. V opačném případě vyhodnocuje pravý operand a vrátí výsledek. Operátor ?? nevyhodnocuje jeho operand zprava, pokud se operand vlevo 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 sjednocení s hodnotou null ??=

Operátor přiřazení přiřazení ??= s hodnotou null přiřazuje hodnotu svého operandu zprava do levého operandu pouze v případě, že se operand vlevo vyhodnotí jako null. Operátor ??= nevyhodnocuje jeho operand zprava, pokud se operand vlevo 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é. Proto je nutné použít {} názvy proměnných jako ${a} nebo 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:

Syntaxe ${<name>} názvu proměnné by neměla být zaměňována 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 kanálu způsobí, že se kanál spustí jako úloha PowerShellu. Když je kanál na pozadí, vrátí se objekt úlohy. Jakmile je kanál spuštěný jako úloha, můžete ke správě úlohy použít všechny standardní *-Job rutiny. Proměnné (bez ohledu na proměnné specifické pro proces) použité v kanálu se automaticky zkopírují do úlohy, takže to funguje jenom.Copy-Item $foo $bar & Úloha se také spustí v aktuálním adresáři místo domovského adresáře uživatele.

Nové metody a vlastnosti zapnuté PSCustomObject

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

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

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Tato práce také zahrnuje ForEach a Where metody, které umožňují pracovat a filtrovat PSCustomObject položky:

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

Převody z PSMethod na delegáta

Můžete převést na PSMethod delegáta. To vám umožní provádět věci, jako je předání PSMethod[M]::DoubleStrLen hodnoty 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 rozhraní .NET 5.0, který zavedl následující zásadní změnu:

Od verze .NET 5.0 ignorují porovnání invariantních řetězců netisknutelných řídicích znaků.

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

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

Nové rutiny

Nová rutina Get-Uptime

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

Nová rutina Remove-Alias

Rutina Remove-Alias odebere alias z aktuální relace PowerShellu. Rutina byla představena v PowerShellu 6.0.

Nová rutina Remove-Service

Rutina Remove-Service odebere službu systému Windows v registru a v databázi služby. Rutina Remove-Service byla představena 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řeveďte 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 jako HTML.

Nová rutina Test-Json

Rutina Test-Json testuje, jestli je řetězec platným dokumentem JSON (JavaScript Object Notation) a může volitelně ověřit, že dokument JSON je v zadaném 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á rutina Join-String

Rutina Join-String kombinuje objekty z kanálu do jednoho řetězce. Tato rutina byla přidána v PowerShellu 6.2.

Nové zobrazení ConciseView a rutina 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. Zobrazení se dají vybrat uživatelem prostřednictvím proměnné $ErrorViewpředvoleb .

Pokud se v ConciseView chyba nespouští ze skriptu nebo chyby analyzátoru, jedná se o chybovou zprávu s jedním řádkem:

Get-Childitem -Path c:\NotReal
Get-ChildItem: Cannot find path 'C:\NotReal' because it does not 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 řídicí sekvence barev ANSI (VT100), barvy se nezobrazí.

Výchozí zobrazení v PowerShellu 7 je ConciseView. Předchozí výchozí zobrazení bylo NormalView a můžete ho vybrat nastavením proměnné $ErrorViewpředvoleb .

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

Poznámka:

K podpoře změny barvy zvýraznění chybové zprávy se přidá $Host.PrivateData nová vlastnost ErrorAccentColor.

Nová Get-Errorrutina poskytuje úplné podrobné zobrazení plně kvalifikované chyby v případě potřeby. Ve výchozím nastavení rutina zobrazí úplné podrobnosti, včetně vnitřních výjimek, poslední chyby, ke které došlo.

Rutina Get-Error podporuje vstup z kanálu pomocí integrované proměnné $Error. Get-Error zobrazí všechny chyby v kanálu.

$Error | Get-Error

Rutina Get-Error podporuje parametr Nejnovější a umožňuje určit, kolik chyb z aktuální relace chcete zobrazit.

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

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

Změny rutin

Paralelní provádění přidané do objektu ForEach-Object

Počínaje PowerShellem 7.0 má rutina ForEach-Object , která iteruje položky v kolekci, nyní integrovanou paralelismus s novým parametrem Parallel .

Ve výchozím nastavení používají bloky paralelních skriptů aktuální pracovní adresář volajícího, který spustil paralelní úlohy.

Tento příklad načte 50 000 položek protokolu z 5 systémových protokolů na místním počítači s 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 určuje blok skriptu, který se spouští paralelně pro každý název vstupního protokolu.

Nový parametr ThrottleLimit omezuje počet bloků skriptů spuštěných paralelně v daném čase. Výchozí volba je 5.

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

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

Kontrola system32 kompatibilních integrovaných modulů ve Windows

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

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

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

-lp alias pro všechny -LiteralPath parametry

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

Oprava Get-Item -LiteralPath a*b , pokud a*b ve skutečnosti neexistuje, aby se vrátila chyba

Dříve by se za předpokladu, -LiteralPath že se zástupný znak považuje za stejný, jako -Path kdyby zástupný znak nenalezl žádné soubory, bezobslužně se ukončil. Správné chování by mělo být literál -LiteralPath , takže pokud soubor neexistuje, měl by se zobrazit chyba. Změna spočívá v zacházení se zástupnými cardy používanými -Literal jako literálem.

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

Rutina Start-Job teď používá aktuální adresář jako pracovní adresář pro novou úlohu.

Odebrání -Protocol z *-Computer rutin

Kvůli problémům se vzdálené komunikace RPC v CoreFX (zejména na platformách bez Windows) a zajištění konzistentního prostředí vzdálené komunikace v PowerShellu -Protocol se parametr z \*-Computer rutin odebral. DCOM se už nepodporuje pro vzdálené komunikace. Následující rutiny podporují pouze vzdálené komunikace WSMAN:

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

Odebrání -ComputerName z *-Service rutin

Aby bylo možné podpořit konzistentní použití PSRP, -ComputerName byl parametr odebrán z *-Service rutin.

Oprava Get-Content -Delimiter nezahrnování oddělovače do vrácených řádků

Dříve byl výstup při použití Get-Content -Delimiter nekonzistentní a nekonvenentní, protože vyžadoval další zpracování dat k odebrání oddělovače. Tato změna odebere oddělovač ve vrácených řádcích.

Změny v Format-Hex

Parametr -Raw je teď "no-op" (v tom, že nic nedělá). V budoucnu se zobrazí veškerý výstup se skutečnou reprezentací čísel, která zahrnují všechny bajty pro svůj typ. Toto je to, co -Raw parametr dělal před touto změnou.

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

BiosSerialNumber byla chybně napsaná tak, jak BiosSeralNumber byla změněna na správný pravopis.

Přidání Get-StringHash a Get-FileHash rutiny

Tato změna spočívá v tom, že CoreFX nepodporuje některé hashovací algoritmy, proto už nejsou k dispozici:

  • MACTripleDES
  • RIPEMD160

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 některé z následujících možností teď 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řidání podpory formátu rozšířeného souboru protokolu W3C v Import-Csv

Dříve se rutina Import-Csv nedá použít k přímému importu souborů protokolu v rozšířeném formátu protokolu W3C a vyžaduje se další akce. Při této změně se podporuje formát rozšířeného protokolu W3C.

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

Dříve se objekty exportované s importovanými Export-CSVTypeInformationConvertFrom-Csv soubory nezachovávaly informace o typu. Tato změna přidá informace o typu členu PSTypeNames , pokud jsou k dispozici ze souboru CSV.

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

Dříve by rutina Export-CSV vypíše komentář jako první řádek obsahující název typu objektu. Tato změna ve výchozím nastavení vylučuje informace o typu, protože většina nástrojů CSV nerozumí. Tato změna byla provedena, aby se vyřešila zpětná vazba zákazníků.

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

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

Dříve by se za předpokladu, -LiteralPath že se zástupný znak považuje za stejný, jako -Path kdyby zástupný znak nenalezl žádné soubory, bezobslužně se ukončil. Správné chování by mělo být literál -LiteralPath , takže pokud soubor neexistuje, měl by se zobrazit chyba. Změna spočívá v zacházení se zástupnými cardy používanými -Literal jako literálem.

Group-Object teď seřadí skupiny.

V rámci vylepšení Group-Object výkonu teď vrátí seřazený seznam skupin. I když byste neměli spoléhat na objednávku, tato změna by mohla být přerušena, pokud chcete 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 této chvíle obsahuje StandardDeviation vlastnost.

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-PfxCertificatenyní má Password parametr, 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

more Odebrání funkce

PowerShell v minulosti odeslal funkci v systému Windows, která byla zabalena moremore.com. Tato funkce byla nyní odebrána.

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

cd DriveName: Nyní vrátí uživatele do aktuálního pracovního adresáře v dané jednotce.

Dříve se pomocí Set-Location nebo cd návratem na PSDrive odesílali uživatelé do výchozího umístění pro danou jednotku. Uživatelé se teď odesílají do posledního známého aktuálního pracovního adresáře pro danou relaci.

cd - 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>

cd Také a cd -- změnit na $HOME.

Update-Help jako nesprávce

Podle oblíbené poptávky Update-Help už nemusí být spuštěný jako správce. Update-Help Teď se ve výchozím nastavení uloží nápověda do složky s vymezeným uživatelem.

Where-Object -Not

Přidáním parametru -Not do Where-Objectlze filtrovat objekt v kanálu pro neexistující vlastnost nebo hodnotu vlastnosti null/empty.

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 rutin

Základní rozhraní .NET API webových rutin bylo změněno na System.Net.Http.HttpClient. Tato změna přináší mnoho výhod. Tato změna spolu s nedostatkem interoperability s Internet Explorerem však vedla k několika zásadním změnám uvnitř Invoke-WebRequest a Invoke-RestMethod.

  • Invoke-WebRequest nyní podporuje pouze základní parsování HTML. Invoke-WebRequest vždy vrátí BasicHtmlWebResponseObject objekt. Odebrali jsme vlastnosti ParsedHtmlForms .
  • BasicHtmlWebResponseObject.Headers hodnoty jsou nyní String[] namísto String.
  • BasicHtmlWebResponseObject.BaseResponse je teď System.Net.Http.HttpResponseMessage objekt.
  • Vlastnost Response výjimek webové rutiny je nyní System.Net.Http.HttpResponseMessage objekt.
  • Pro a -UserAgent parametr je teď výchozí -Headers nastavení přísné analýzy hlaviček RFC. To lze obejít pomocí -SkipHeaderValidation.
  • file:// a ftp:// schémata identifikátorů URI se už nepodporují.
  • System.Net.ServicePointManager nastavení se už nedotknou.
  • V systému macOS aktuálně není k dispozici ověřování založené na certifikátech.
  • Použití identifikátoru -Credentialhttp:// URI způsobí chybu. https:// K potlačení chyby použijte identifikátor URI nebo zadejte -AllowUnencryptedAuthentication parametr.
  • -MaximumRedirection nyní vytvoří ukončující chybu, když pokusy o přesměrování překročí zadaný limit místo vrácení výsledků 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
  • Vyhovující zpracování relačních klíčů bez rozlišování velkých a malých písmen
  • Přidání -Resume parametru pro webové rutiny

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

Když se rozhraní API vrátí jen null, Invoke-RestMethod serializovalo se to jako řetězec místo .$null"null" Tato změna opravuje logiku Invoke-RestMethod , aby správně serializovala platný literál JSON null s jednou hodnotou jako $null.

Webové rutiny varují při -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í nepovoluje a vrátí chybu, pokud se přihlašovací údaje předávají nezabezpečeně. Uživatelé ho můžou obejít pomocí -AllowUnencryptedAuthentication přepínače.

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

Počínaje PowerShellem 7.1 funguje parametr OutFile webových rutin, jako je LiteralPath , a nezpracuje zástupné cardy.

Změny rozhraní API

Odebrat AddTypeCommandBase třídu

Třída AddTypeCommandBase byla odebrána, Add-Type aby se zlepšil výkon. Tuto třídu používá Add-Type pouze rutina a neměla by mít vliv na uživatele.

VisualBasic Odebrání jako podporovaný jazyk v doplňku

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

RunspaceConfiguration Odebrání podpory

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 odebrala podporu pouze InitialSessionStatepro RunspaceConfiguration .

CommandInvocationIntrinsics.InvokeScriptvytvoření vazby argumentů místo $input$args

Nesprávná pozice parametru způsobila, že argumenty předané jako vstup místo jako argy.

Odebrání ClrVersion a BuildVersion vlastnosti z $PSVersionTable

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

Vlastnost BuildVersion byla svázána s verzí sestavení Systému Windows, která není k dispozici na platformách jiných než Windows. Pomocí vlastnosti načtěte GitCommitId přesnou verzi sestavení PowerShellu.

Implementace řídicího parsování unicode

`u#### nebo `u{####} je převeden na odpovídající znak Unicode. Pro výstup literálu `uunikni backtick: ``u.

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

ValueFromRemainingArguments Nyní vrátí hodnoty jako pole místo jedné hodnoty, která je sama polem.

Vyčištěné využ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 vnitřní. 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.

Nezalamujte výsledek PSObject vrácení při převodu ScriptBlock na delegáta.

Při převodu ScriptBlock na typ delegáta, který se má použít v kontextu jazyka C#, zabalení výsledku PSObject do nepotřebných problémů:

  • Při převodu hodnoty na návratový typ delegáta se PSObject v podstatě rozbalí. Takže je PSObject nepotřebný.
  • Když je objectnávratový typ delegáta , zabalí PSObject se do toho, aby bylo těžké pracovat s kódem jazyka C#.

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

Podpora vzdálené komunikace

Vzdálené komunikace Prostředí PowerShell (PSRP) využívající WinRM na platformách Unix vyžaduje NTLM/Negotiate nebo základní ověřování přes PROTOKOL HTTPS. PSRP v macOS podporuje pouze základní ověřování přes HTTPS. Ověřování založené na protokolu Kerberos není podporováno pro platformy jiné než Windows.

PowerShell podporuje také vzdálené komunikace PowerShellu (PSRP) přes SSH na všech platformách (Windows, macOS a Linux). Další informace najdete v tématu Vzdálené komunikace 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 Nebo kontejneru Hyper-V bez síťového připojení 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 teď pokusí připojit pomocí libovolné dostupné pwsh.exePATH proměnné prostředí. Pokud pwsh.exe není k dispozici, PowerShell Direct se vrátí k použití powershell.exe.

Enable-PSRemoting Teď vytvoří samostatné koncové body vzdálené komunikace pro verze Preview.

Enable-PSRemoting teď vytvoří dvě konfigurace relace vzdálené komunikace:

  • Jedna pro hlavní verzi PowerShellu. Například PowerShell.6. Tento koncový bod, který se dá spoléhat na aktualizace podverze, jako konfiguraci relace PowerShellu 6 pro celý systém
  • Konfigurace relace specifická pro jednu verzi, 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.

Verze Preview PowerShellu teď navíc po spuštění Enable-PSRemoting rutiny získají vlastní konfigurace relace vzdálené komunikace:

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 Podporovaná syntaxe 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á do Microsoftu základní telemetrická data 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 POWERSHELL_TELEMETRY_OPTOUT prostředí na true, yesnebo 1. Odstranění souboru DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY už nepodporujeme, abychom zakázali telemetrii.