Condividi tramite


Differenze tra Windows PowerShell 5.1 e PowerShell 7.x

Windows PowerShell 5.1 si basa su .NET Framework v4.5. Con il rilascio di PowerShell 6.0, PowerShell è diventato un progetto open source basato su .NET Core 2.0. Il passaggio da .NET Framework a .NET Core ha consentito a PowerShell di diventare una soluzione multipiattaforma. PowerShell viene eseguito in Windows, macOS e Linux.

Esistono alcune differenze nel linguaggio di PowerShell tra Windows PowerShell e PowerShell. Le differenze più significative sono la disponibilità e il comportamento dei cmdlet di PowerShell tra le piattaforme Windows e non Windows e le modifiche che derivano dalle differenze tra .NET Framework e .NET Core.

Questo articolo riepiloga le differenze significative e le modifiche di rilievo tra Windows PowerShell e la versione corrente di PowerShell. Questo riepilogo non include nuove funzionalità o cmdlet aggiunti. Questo articolo non illustra le modifiche apportate tra le versioni. L'obiettivo di questo articolo è presentare lo stato corrente di PowerShell e il modo in cui è diverso da Windows PowerShell. Per una descrizione dettagliata delle modifiche tra le versioni e l'aggiunta di nuove funzionalità, vedere gli articoli Novità per ogni versione.

.NET Framework e .NET Core

PowerShell in Linux e macOS usa .NET Core, che è un subset di .NET Framework completo in Microsoft Windows. Ciò è significativo perché PowerShell consente l'accesso diretto ai metodi e ai tipi di framework sottostanti. Di conseguenza, gli script eseguiti in Windows potrebbero non essere eseguiti su piattaforme non Windows a causa delle differenze nei framework. Per altre informazioni sulle modifiche in .NET Core, vedere Modifiche di rilievo per la migrazione da .NET Framework a .NET Core.

Ogni nuova versione di PowerShell è basata su una versione più recente di .NET. Ci possono essere modifiche rompenti in .NET che influiscono su PowerShell.

  • PowerShell 7.6 - Basato su .NET 10.0 (LTS)
  • PowerShell 7.5 - Basato su .NET 9.0
  • PowerShell 7.4 - Basato su .NET 8.0 (LTS)
  • PowerShell 7.3 - Basato su .NET 7.0
  • PowerShell 7.2 - Basato su .NET 6.0 (LTS)
  • PowerShell 7.1 - Basato su .NET 5.0
  • PowerShell 7.0 - Basato su .NET Core 3.1 (LTS)
  • PowerShell 6.2 - Basato su .NET Core 2.1
  • PowerShell 6.1 - Basato su .NET Core 2.1
  • PowerShell 6.0 - Basato su .NET Core 2.0

Con l'avvento di .NET Standard 2.0, PowerShell può caricare molti moduli tradizionali di Windows PowerShell senza modifiche. PowerShell 7 include inoltre una funzionalità di compatibilità di Windows PowerShell che consente di usare moduli di Windows PowerShell che richiedono ancora il framework completo.

Per altre informazioni, vedere:

Tenere presente le modifiche apportate ai metodi .NET

Anche se le modifiche ai metodi .NET non sono specifiche di PowerShell, possono influire sugli script, soprattutto se si chiamano direttamente i metodi .NET. Potrebbero inoltre essere presenti nuovi overload per i costruttori. Ciò può avere un impatto sul modo in cui si creano oggetti usando New-Object o il [type]::new() metodo .

Ad esempio, .NET ha aggiunto overload al metodo [System.String]::Split() che non sono disponibili in .NET Framework 4.5. L'elenco seguente mostra gli overload per il metodo Split() disponibili in 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)

L'elenco seguente mostra gli overload per il Split() metodo disponibile in 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)

In Windows PowerShell 5.1, è possibile passare una matrice di caratteri (char[]) al metodo Split() come string. Il metodo divide la stringa di destinazione in qualsiasi occorrenza di un carattere nella matrice. Il comando seguente suddivide la stringa di destinazione in Windows PowerShell 5.1, ma non in PowerShell 7:

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

Per eseguire l'associazione alla corretta funzione overload, è necessario eseguire il cast della stringa a un array di caratteri.

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

I moduli non vengono più forniti con PowerShell

Per diversi motivi di compatibilità, i moduli seguenti non sono più inclusi in PowerShell.

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

Flusso di lavoro PowerShell

PowerShell Workflow è una funzionalità di Windows PowerShell che si basa su Windows Workflow Foundation (WF) e consente la creazione di runbook robusti per compiti di lunga durata o parallelizzati.

A causa della mancanza di supporto per Windows Workflow Foundation in .NET Core, è stato rimosso il flusso di lavoro di PowerShell da PowerShell.

In futuro, si vuole abilitare il parallelismo nativo/concorrenza nel linguaggio PowerShell senza la necessità del flusso di lavoro di PowerShell.

Se è necessario usare i checkpoint per riprendere uno script dopo il riavvio del sistema operativo, è consigliabile usare l'Utilità di pianificazione per eseguire uno script all'avvio del sistema operativo, ma lo script deve mantenere il proprio stato (ad esempio per renderlo persistente in un file).

Cmdlet rimossi da PowerShell

Per i moduli inclusi in PowerShell, i cmdlet seguenti sono stati rimossi da PowerShell per vari motivi di compatibilità o l'uso di API non supportate.

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

Cmdlet WMI v1

I cmdlet WMI v1 seguenti sono stati rimossi da PowerShell:

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

I cmdlet del modulo CimCmdlets (detto anche WMI v2) svolgono la stessa funzione e offrono nuove funzionalità e una sintassi riprogettata.

New-WebServiceProxy Cmdlet rimosso

.NET Core non supporta Windows Communication Framework, che fornisce servizi per l'uso del protocollo SOAP. Questo cmdlet è stato rimosso perché richiede SOAP.

*-Transaction Cmdlets rimossi

Questi cmdlet hanno avuto un utilizzo molto limitato. La decisione è stata presa di interrompere il sostegno per loro.

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

*-EventLog cmdlet

A causa dell'uso di API non supportate, i *-EventLog cmdlet sono stati rimossi da PowerShell. Get-WinEvent e New-WinEvent sono disponibili per ottenere e creare eventi su Windows.

Cmdlet che usano Windows Presentation Framework (WPF)

.NET Core 3.1 ha aggiunto il supporto per WPF, quindi la versione di PowerShell 7.0 ha ripristinato le funzionalità specifiche di Windows seguenti:

  • Cmdlet Show-Command
  • Cmdlet Out-GridView
  • Parametro ShowWindow di Get-Help

Modifiche di PowerShell DSC (Configurazione dello Stato Desiderato)

Invoke-DscResource è stata ripristinata come funzionalità sperimentale in PowerShell 7.0.

A partire da PowerShell 7.2, il modulo PSDesiredStateConfiguration è stato rimosso da PowerShell ed è stato pubblicato in PowerShell Gallery. Per altre informazioni, vedere l'annuncio nel blog del team di PowerShell.

Modifiche eseguibili di PowerShell

Rinominato powershell.exe in pwsh.exe

Il nome binario per PowerShell è stato modificato da powershell(.exe) a pwsh(.exe). Questa modifica offre agli utenti un modo deterministico per eseguire PowerShell nei computer e supportare installazioni side-by-side di Windows PowerShell e PowerShell.

Ulteriori modifiche da pwsh(.exe)powershell.exe:

  • Cambiato il primo parametro posizionale da -Command a -File. Questa modifica corregge l'uso di #! (cioè come shebang) negli script PowerShell eseguiti da shell non PowerShell su piattaforme non Windows. Significa anche che puoi eseguire comandi come pwsh foo.ps1 o pwsh fooScript senza specificare -File. Tuttavia, questo cambiamento richiede che tu specifichi -c esplicitamente o -Command , quando provi a eseguire comandi come pwsh.exe -Command Get-Command.
  • pwsh accetta l'opzione -i (o -Interactive) per indicare una shell interattiva. In questo modo PowerShell può essere usato come shell predefinita nelle piattaforme Unix.
  • Rimossi i parametri -ImportSystemModules e -PSConsoleFile da pwsh.exe.
  • Aiuto modificato pwsh -Version e integrato per pwsh.exe allinearsi ad altri strumenti nativi.
  • Messaggi di errore di argomento non validi per -File e -Command e codici di uscita coerenti con gli standard Unix
  • Parametro aggiunto -WindowStyle su Windows. Analogamente, gli aggiornamenti delle installazioni basate su pacchetti su piattaforme non Windows sono aggiornamenti in loco.

Il nome abbreviato è anche coerente con la denominazione delle shell in piattaforme non Windows.

Supporto per l'esecuzione di uno script di PowerShell con il parametro bool

In precedenza, usando pwsh.exe per eseguire uno script di PowerShell con -File, non c'era modo di passare $true/$false come valori di parametro. È stato aggiunto il supporto per $true/$false i valori come analizzato ai parametri. Anche i valori switch sono supportati.

Migliorata compatibilità retroattiva con Windows PowerShell

Per Windows, viene aggiunto un nuovo parametro di commutazione, UseWindowsPowerShell , a Import-Module. Questo switch crea un modulo proxy in PowerShell 7 che utilizza un processo PowerShell locale di Windows per eseguire implicitamente qualsiasi cmdlet contenuto in quel modulo. Per altre informazioni, vedere Import-Module.

Per maggiori informazioni su quali moduli Microsoft funzionano con PowerShell 7.0, consulta la Tabella di Compatibilità dei Moduli.

Supporto Microsoft Update per Windows

PowerShell 7.2 ha aggiunto il supporto per Microsoft Update. Quando abiliti questa funzione, riceverai gli ultimi aggiornamenti di PowerShell 7 nel tuo flusso di gestione tradizionale di Windows Update (WU), che sia tramite Windows Update for Business, WSUS, SCCM o la finestra interattiva WU nelle Impostazioni.

Il pacchetto PowerShell 7.2 MSI include le seguenti opzioni di riga di comando:

  • USE_MU - Questa proprietà ha due valori possibili:
    • 1 (predefinito) - Accede ad aggiornare tramite Microsoft Update o WSUS
    • 0 - Non acconsentire esplicitamente all'aggiornamento tramite Microsoft Update o WSUS
  • ENABLE_MU
    • 1 (predefinito) - Sceglie di utilizzare Microsoft Update per gli Aggiornamenti Automatici o Windows Update
    • 0 - Non acconsentire all'uso di Microsoft Update, Aggiornamenti Automatici o Windows Update

Modifiche del motore

Supportare il PowerShell come shell Unix predefinita

In Unix è una convenzione per le shell accettare -i per una shell interattiva, e molti strumenti prevedono questo comportamento (script, ad esempio, e quando si imposta PowerShell come shell predefinita) e chiamano la shell con l'opzione -i. Questa modifica si sta interrupponendo che -i prima poteva essere usata come abbreviazione per corrispondere -InputFormat, che ora deve essere -in.

Snap-in personalizzati

Gli snap-in di PowerShell sono un predecessore dei moduli di PowerShell che non hanno un'adozione diffusa nella community di PowerShell.

A causa della complessità del supporto degli snap-in e della mancanza di utilizzo nella community, non sono più supportati snap-in personalizzati in PowerShell.

Flag di funzionalità sperimentali

PowerShell 6.2 ha abilitato il supporto per le funzionalità sperimentali. In questo modo gli sviluppatori di PowerShell possono fornire nuove funzionalità e ricevere commenti e suggerimenti prima del completamento della progettazione. In questo modo si evitano modifiche di rilievo man mano che la progettazione si evolve.

Usalo Get-ExperimentalFeature per ottenere un elenco delle funzionalità sperimentali disponibili. Puoi abilitare o disabilitare queste funzionalità con Enable-ExperimentalFeature e Disable-ExperimentalFeature.

Caricare l'assembly dal percorso di base del modulo prima di provare a caricare dalla GAC

In precedenza, quando un modulo binario ha l'assembly del modulo nella GAC, è stato caricato l'assembly dalla GAC prima di provare a caricarlo dal percorso di base del modulo.

Ignorare il controllo degli elementi null per le raccolte con un elemento di tipo valore

Per i Mandatory parametri e ValidateNotNull attributi e ValidateNotNullOrEmpty , si salta il controllo dell'elemento nullo se il tipo di elemento della collezione è di tipo valore.

Mantieni $? per ParenExpression, SubExpression e ArrayExpression

Questa richiesta pull modifica il modo in cui si compilano sottopipeline (...), sottoespressioni $(...) ed espressioni di array @() in modo che $? non sia automaticamente vero. Il valore di $? dipende invece dal risultato della pipeline o delle istruzioni eseguite.

Risolvi $? per evitare che sia $false quando il comando nativo scrive su stderr

$? non è impostato su $false quando il comando nativo scrive in stderr. È comune che i comandi nativi scrivano su stderr senza voler indicare un errore. $? è impostato su $false solo quando il comando nativo ha un codice di uscita diverso da zero.

Non far sì che $ErrorActionPreference influenzi l'output stderr dei comandi nativi

È comune che i comandi nativi scrivano su stderr senza l'intenzione di indicare un errore. Con questa modifica, stderr l'output viene ancora catturato negli oggetti ErrorRecord , ma l'esecuzione non si applica $ErrorActionPreference più se l'ErrorRecord proviene da un comando nativo.

Modificare $OutputEncoding per usare la UTF-8 NoBOM codifica anziché ASCII

La codifica precedente, ASCII (7 bit), provocherebbe un'alterazione errata dell'output in alcuni casi. L'impostazione UTF-8 NoBOM predefinita mantiene l'output Unicode con una codifica supportata dalla maggior parte degli strumenti e dei sistemi operativi.

Uniforma i cmdlet con il parametro -Encoding per essere di tipo System.Text.Encoding

Il -Encoding valore Byte è stato rimosso dai cmdlet del provider FileSystem. Un nuovo parametro, -AsByteStream, viene ora usato per specificare che è necessario un flusso di byte come input o che l'uscita è un flusso di byte.

Modificare la codifica New-ModuleManifest in UTF8NoBOM nelle piattaforme non Windows

In precedenza, New-ModuleManifest creava psd1 manifesti in UTF-16 con BOM, creando un problema per i strumenti Linux. Questa modifica rivoluzionaria modifica la codifica di New-ModuleManifest per diventare UTF (senza BOM) sulle piattaforme non Windows.

Rimuovere AllScope dalla maggior parte degli alias predefiniti

Per velocizzare la creazione dell'ambito, AllScope è stato rimosso dalla maggior parte degli alias predefiniti. AllScope è stato lasciato per alcuni alias frequentemente usati dove la ricerca era più veloce.

-Verbose e -Debug non sovrascrive più $ErrorActionPreference

In precedenza, se -Verbose o -Debug venivano specificati, sovrascriveva il comportamento di $ErrorActionPreference. Con questo cambiamento, -Verbose e -Debug non influenzano più il comportamento di $ErrorActionPreference.

Inoltre, il -Debug parametro imposta $DebugPreference su Continue invece di Inquire.

Rendere $PSCulture coerentemente riflettente le modifiche alla cultura durante la sessione

In Windows PowerShell, il valore corrente delle impostazioni cultura viene memorizzato nella cache, il che può portare a una mancata sincronizzazione del valore quando le impostazioni cultura vengono modificate dopo l'avvio della sessione. Questo comportamento di memorizzazione nella cache è stato risolto nel core di PowerShell.

Consenti a un parametro nominato esplicitamente di sostituire lo stesso parametro nello "splatting" di una hashtable.

Con questa modifica, i parametri nominati derivati dallo splatting vengono spostati alla fine dell'elenco di parametri, in modo che siano associati dopo che tutti i parametri nominati specificati esplicitamente sono già stati associati. L'associazione di parametri per funzioni semplici non genera un errore quando non è possibile trovare un parametro denominato specificato. Parametri nominati sconosciuti sono legati al $args parametro della funzione semplice. Spostando lo splatting alla fine della lista degli argomenti, cambia l'ordine in cui i parametri appaiono in $args.

Per esempio:

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

Nel comportamento precedente , MyPath non è associato a -Path perché è il terzo argomento nell'elenco di argomenti. ## Quindi finisce per essere infilato in '$args' insieme a Blah = "World"

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

Con questo cambiamento, gli argomenti da @hash vengono spostati alla fine della lista degli argomenti. MyPath diventa il primo argomento nell'elenco, quindi è associato a -Path.

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

Modifiche della lingua

Operatore null-coalescing ??

L'operatore di coalescenza di valori Null ?? restituisce il valore dell'operando di sinistra se non è Null. In caso contrario, valuta l'operando di destra e ne restituisce il risultato. L'operatore ?? non valuta l'operando di destra se l'operando di sinistra restituisce un valore diverso da Null.

$x = $null
$x ?? 100
100

Nell'esempio seguente l'operando di destra non verrà valutato.

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

Operatore di assegnazione null-coalescing ??=

L'operatore di assegnazione null-coalescing ??= assegna il valore dell'operando di destra all'operando di sinistra solo se l'operando di sinistra restituisce Null. L'operatore ??= non valuta l'operando di destra se l'operando di sinistra restituisce un valore diverso da Null.

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

Nell'esempio seguente l'operando di destra non verrà valutato.

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

Operatori condizionali null

Annotazioni

Questa funzionalità è stata spostata da sperimentale a mainstream in PowerShell 7.1.

Un operatore condizionale Null applica un accesso ai membri, ?., o l'accesso agli elementi, , ?[]al relativo operando solo se l'operando restituisce un valore diverso da Null; in caso contrario, restituisce Null.

Poiché in PowerShell ? può essere incluso nel nome della variabile, è necessario specificare formalmente il nome della variabile per usare questi operatori. Quindi è necessario usare {} intorno ai nomi delle variabili come ${a} o quando ? fa parte del nome ${a?}della variabile .

Nell'esempio seguente viene restituito il valore di PropName .

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

Nell'esempio seguente viene restituito null, senza tentare di accedere al nome del membro PropName.

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

Analogamente, verrà restituito il valore dell'elemento.

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

E quando l'operando è Null, l'elemento non è accessibile e viene restituito Null.

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

Annotazioni

La sintassi del nome della variabile di ${<name>} non deve essere confusa con l'operatore $() di sottoespressione. Per altre informazioni, vedere la sezione Nome variabile di about_Variables.

Aggiunto l'operatore & per il controllo dei job

Posizionando & alla fine di una pipeline, la pipeline viene eseguita come un lavoro PowerShell. Quando una pipeline è in background, viene restituito un oggetto processo. Una volta che la pipeline è in esecuzione come un job, tutti i cmdlet standard *-Job possono essere utilizzati per gestire il job. Le variabili (ignorando quelle specifiche del processo) usate nella pipeline vengono automaticamente copiate nel lavoro quindi Copy-Item $foo $bar & funzionano e funzionano. Il processo viene eseguito anche nella directory corrente anziché nella home directory dell'utente.

Nuovi metodi/proprietà su PSCustomObject

Sono stati aggiunti nuovi metodi e proprietà a PSCustomObject. PSCustomObject ora include una Count/Length proprietà come altri oggetti.

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

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Questo lavoro include ForEach anche metodi Where che ti permettono di lavorare e filtrare gli PSCustomObject oggetti:

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

Conversioni da PSMethod a delegato

È possibile convertire un oggetto PSMethod in un delegato. Questo ti permette di fare cose come passare PSMethod[M]::DoubleStrLen come valore delegato in [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)

Comportamento del confronto di stringhe modificato in PowerShell 7.1

PowerShell 7.1 è costruito su .NET 5.0, che ha introdotto la seguente modifica interruttiva:

A partire da .NET 5.0, i confronti delle stringhe invarianti di cultura ignorano i caratteri di controllo non stampanti.

Ad esempio, le seguenti due stringhe sono considerate identiche:

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

I nuovi cmdlet

Il nuovo Get-Uptime cmdlet

Il cmdlet Get-Uptime restituisce il tempo trascorso dall'ultimo avvio del sistema operativo. Il cmdlet è stato introdotto in PowerShell 6.0.

Nuovo Remove-Alias cmdlet

Il cmdlet Remove-Alias rimuove un alias dalla sessione di PowerShell corrente. Il cmdlet è stato introdotto in PowerShell 6.0.

Nuovo Remove-Service cmdlet

Il cmdlet Remove-Service rimuove un servizio di Windows nel Registro di sistema e nel database del servizio. Il cmdlet Remove-Service è stato introdotto in PowerShell 6.0.

I nuovi cmdlet di Markdown

Markdown è uno standard per la creazione di documenti di testo non crittografato leggibili con formattazione di base di cui è possibile eseguire il rendering in HTML.

In PowerShell 6.1 sono stati aggiunti i cmdlet seguenti:

  • ConvertFrom-Markdown : consente di convertire il contenuto di una stringa o di un file in un oggetto MarkdownInfo .
  • Get-MarkdownOption : restituisce i colori e gli stili correnti usati per il rendering del contenuto Markdown nella console.
  • Set-MarkdownOption : imposta i colori e gli stili usati per il rendering del contenuto Markdown nella console.
  • Show-Markdown - Visualizza il contenuto markdown nella console o come HTML

Nuovo Test-Json cmdlet

Il cmdlet Test-Json verifica se una stringa è un documento JSON (JavaScript Object Notation) valido e può facoltativamente verificare che il documento JSON sia rispetto a uno schema specificato.

Questo cmdlet è stato introdotto in PowerShell 6.1

Nuovi cmdlet per supportare le funzionalità sperimentali

I cmdlet seguenti sono stati aggiunti in PowerShell 6.2 per supportare le funzionalità sperimentali.

Nuovo Join-String cmdlet

Il cmdlet Join-String combina gli oggetti della pipeline in una singola stringa. Questo cmdlet è stato aggiunto in PowerShell 6.2.

Nuova visualizzazione ConciseView e cmdlet Get-Error

PowerShell 7.0 migliora la visualizzazione dei messaggi di errore per migliorare la leggibilità degli errori interattivi e di script con una nuova visualizzazione predefinita , ConciseView. Le viste sono selezionabili dall'utente tramite la variabile $ErrorViewdi preferenza .

Con ConciseView, se un errore non deriva da uno script o da un parser, allora si tratta di un messaggio di errore di una sola riga:

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

Se l'errore si verifica durante l'esecuzione dello script o è un errore di analisi, PowerShell restituisce un messaggio di errore su più righe contenente l'errore, un puntatore e un messaggio di errore che mostra dove si trova l'errore in tale riga. Se il terminale non supporta sequenze di escape colore ANSI (VT100), allora i colori non vengono visualizzati.

La vista predefinita in PowerShell 7 è ConciseView. La precedente vista predefinita era NormalView e puoi selezionarla impostando la variabile $ErrorViewpreference .

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

Annotazioni

Viene aggiunta una nuova proprietà, ErrorAccentColor , $Host.PrivateData per supportare la modifica del colore d'accento del messaggio di errore.

Il nuovo Get-Errorcmdlet fornisce una visione completa e dettagliata dell'errore qualificato quando si desidera. Di default il cmdlet mostra tutti i dettagli, comprese le eccezioni interne, dell'ultimo errore avvenuto.

Il Get-Error cmdlet supporta input dalla pipeline usando la variabile $Errorintegrata . Get-Error Mostra tutti gli errori di pip.

$Error | Get-Error

Il Get-Error cmdlet supporta il parametro Newest , permettendoti di specificare quanti errori della sessione corrente desideri che vengano visualizzati.

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

Per altre informazioni, vedere Get-Error.

Modifiche ai cmdlet

Esecuzione parallela aggiunta a ForEach-Object

A partire da PowerShell 7.0, il ForEach-Object cmdlet che esegue l'iterazione degli elementi in una raccolta ha ora un parallelismo predefinito con il nuovo parametro Parallel .

Di default, i blocchi di script paralleli utilizzano la directory di lavoro corrente del chiamante che ha avviato i compiti paralleli.

Questo esempio recupera 50.000 voci di log da 5 log di sistema su una macchina Windows locale:

$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

Il parametro Parallel specifica il blocco script che viene eseguito in parallelo per ogni nome di log di input.

Il nuovo parametro ThrottleLimit limita il numero di blocchi script che vengono eseguiti in parallelo in un dato momento. L'impostazione predefinita è 5.

Usa la $_ variabile per rappresentare l'oggetto di input corrente nel blocco di script. Usare il modificatore dell'ambito Using: per passare riferimenti a variabili al blocco di script in esecuzione.

Per altre informazioni, vedere ForEach-Object.

Controlla system32 la presenza di moduli integrati compatibili su Windows

Nell'aggiornamento di Windows 10 1809 e Windows Server 2019 è stato aggiornato un certo numero di moduli di PowerShell predefiniti per contrassegnarli come compatibili con PowerShell.

All'avvio di PowerShell, include $windir\System32 automaticamente come parte della PSModulePath variabile di ambiente. Tuttavia, espone i moduli solo a Get-Module e Import-Module se è CompatiblePSEdition contrassegnato come compatibile con Core.

Puoi sovrascrivere questo comportamento per mostrare tutti i moduli usando il parametro -SkipEditionCheck dello switch. Abbiamo anche aggiunto una PSEdition proprietà all'output della tabella.

-lp alias per tutti -LiteralPath i parametri

È stato creato un alias -lp di parametro standard per tutti i cmdlet predefiniti di PowerShell con un -LiteralPath parametro .

Correggi Get-Item -LiteralPath a*b se a*b non esiste effettivamente, per restituire un errore

In precedenza, -LiteralPath dato che un wildcard lo trattava allo stesso modo e -Path se il jolly non trovava file, usciva silenziosamente. Il comportamento corretto dovrebbe essere letterale -LiteralPath , quindi se il file non esiste, dovrebbe dare un errore. Il cambiamento consiste nel trattare le carte jolly usate -Literal come letterale.

Impostare la directory di lavoro sulla directory corrente in Start-Job

Il Start-Job cmdlet usa ora la directory corrente come directory di lavoro per il nuovo processo.

Rimuovere -Protocol dai *-Computer cmdlet

Il -Protocol parametro è stato rimosso dai cmdlet seguenti:

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

DCOM non è più supportato per la comunicazione remota. I cmdlet supportano solo la comunicazione remota WSMAN.

Rimuovere -ComputerName dai *-Service cmdlet

Per incoraggiare l'uso costante del PSRP, il -ComputerName parametro è stato rimosso dai *-Service cmdlet. Usare Invoke-Command invece per eseguire i cmdlet nei computer remoti.

Correzione Get-Content -Delimiter per non includere il delimitatore nelle righe restituite

In precedenza, l'output durante l'uso Get-Content -Delimiter era incoerente e scomodo poiché richiedeva un ulteriore elaboramento dei dati per rimuovere il delimitatore. Questa modifica rimuove il delimitatore nelle righe restituite.

Modifiche apportate a Format-Hex

Il -Raw parametro non esegue ora alcuna operazione. Il Format-Hex cmdlet visualizza una rappresentazione vera dei numeri che include tutti i byte per il relativo tipo. Questo è ciò che il -Raw parametro ha fatto prima di questa modifica.

Correzione di errori di ortografia nel Get-ComputerInfo nome della proprietà

BiosSerialNumber è stato scritto male come BiosSeralNumber ed è stato cambiato con la grafia corretta.

Modifiche agli algoritmi hash disponibili

Gli algoritmi hash seguenti sono stati rimossi da .NET:

  • MACTripleDES
  • RIPEMD160

Questa modifica influisce sul Get-FileHash cmdlet.

Aggiungere la convalida nei Get-* cmdlet in cui il passaggio di $null restituisce tutti gli oggetti anziché l'errore

Passare $null a uno dei seguenti ora genera un errore:

  • 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

Aggiunta del supporto per il formato di file di log esteso W3C in Import-Csv

In precedenza, il Import-Csv cmdlet non può essere usato per importare direttamente i file di log in formato di log esteso W3C e sarebbe necessaria un'azione aggiuntiva. Con questa modifica, è supportato il formato di log esteso W3C.

Import-Csv pstypenames si applica all'importazione quando le informazioni sul tipo sono presenti nel file CSV

In precedenza, gli oggetti esportati usando Export-Csv con TypeInformation importati con ConvertFrom-Csv non conservavano le informazioni sul tipo. Questa modifica aggiunge le informazioni di tipo al pstypenames membro se disponibili dal file CSV.

-NoTypeInformation è l'impostazione predefinita su Export-Csv

In precedenza, il Export-Csv cmdlet restituisce un commento come prima riga contenente il nome del tipo dell'oggetto. La modifica esclude le informazioni sul tipo per impostazione predefinita perché non viene riconosciuta dalla maggior parte degli strumenti CSV. Questa modifica è stata apportata per rispondere ai commenti e suggerimenti dei clienti.

Usalo -IncludeTypeInformation per mantenere il comportamento precedente.

Consentire l'uso di * nel percorso del Registro di sistema per Remove-Item

In precedenza, -LiteralPath dato che un wildcard lo trattava allo stesso modo e -Path se il jolly non trovava file, usciva silenziosamente. Il comportamento corretto dovrebbe essere letterale -LiteralPath , quindi se il file non esiste, dovrebbe dare un errore. Il cambiamento consiste nel trattare le carte jolly usate -Literal come letterale.

Group-Object ora ordina i gruppi

Come parte del miglioramento delle prestazioni, Group-Object ora restituisce un elenco ordinato dei gruppi. Anche se non dovresti fare affidamento sull'ordine, potresti essere influenzato negativamente da questa modifica se desideravi il primo gruppo. È stato deciso che questo miglioramento delle prestazioni valeva la pena modificare poiché l'impatto di dipendere dal comportamento precedente è basso.

Deviazione standard in Measure-Object

L'output da Measure-Object ora include la proprietà 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 ora ha il Password parametro , che accetta un oggetto SecureString. In questo modo è possibile usarlo in modo non interattivo:

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

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

Rimozione della more funzione

In passato, PowerShell rilasciava una funzione su Windows chiamata more that wrapped more.com. La funzione è stata rimossa.

Inoltre, la help funzione è stata modificata per essere usata more.com su Windows, o il cercapersone predefinito del sistema specificato su $Env:PAGER piattaforme non Windows.

cd DriveName: ora gli utenti riportano alla directory di lavoro corrente in quell'unità

In precedenza, l'uso Set-Location di o cd per tornare a un PSDrive mandava gli utenti alla posizione predefinita di quel disco. Gli utenti vengono ora inviati all'ultima directory di lavoro corrente nota per la sessione.

cd - ritorni alla directory precedente

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

Oppure in Linux:

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

Inoltre, cd e cd -- cambia in $HOME.

Update-Help come non amministratore

Per richiesta popolare, Update-Help non è più necessario essere gestito come amministratore. Update-Help Ora di default salva l'aiuto in una cartella con scopo utente.

Where-Object -Not

Con l'aggiunta del -Not parametro a Where-Object, può filtrare un oggetto nella pipeline per l'assenza di una proprietà o un valore di proprietà null/vuoto.

Ad esempio, questo comando restituisce tutti i servizi che non dispongono di servizi dipendenti definiti:

Get-Service | Where-Object -Not DependentServices

Modifiche ai cmdlet Web

L'API .NET sottostante dei Web Cmdlet è stata cambiata in System.Net.Http.HttpClient. Questa modifica offre molti vantaggi. Tuttavia, questo cambiamento insieme alla mancanza di interoperabilità con Internet Explorer ha portato a diversi cambiamenti di rompimento all'interno Invoke-WebRequest di e Invoke-RestMethod.

  • Invoke-WebRequest ora supporta solo l'analisi sintetica di base in HTML. Invoke-WebRequest restituisce sempre un BasicHtmlWebResponseObject oggetto. Le ParsedHtml proprietà e Forms sono state rimossi.
  • BasicHtmlWebResponseObject.Headers i valori ora String[] sono invece di String.
  • BasicHtmlWebResponseObject.BaseResponse ora è un System.Net.Http.HttpResponseMessage oggetto.
  • La Response proprietà sulle eccezioni Web Cmdlet ora è un System.Net.Http.HttpResponseMessage oggetto.
  • La parsing rigorosa dell'intestazione RFC è ora predefinita per il -Headers parametro e.-UserAgent Questo può essere bypassato con -SkipHeaderValidation.
  • file:// e ftp:// gli schemi URI non sono più supportati.
  • System.Net.ServicePointManager Le impostazioni non sono più rispettate.
  • Attualmente non è disponibile alcuna autenticazione basata su certificati in macOS.
  • L'uso di -Credential sopra un http:// URI comporterà un errore. Usa un https:// URI o fornisce il -AllowUnencryptedAuthentication parametro per sopprimere l'errore.
  • -MaximumRedirection ora produce un errore di terminazione quando i tentativi di reindirizzamento superano il limite fornito invece di restituire i risultati dell'ultimo reindirizzamento.
  • In PowerShell 6.2 è stata apportata una modifica per impostazione predefinita alla codifica UTF-8 per le risposte JSON. Quando non viene fornito un set di caratteri per una risposta JSON, la codifica predefinita deve essere UTF-8 per RFC 8259.
  • Codifica predefinita impostata su UTF-8 per le risposte application-json
  • Aggiunto parametro -SkipHeaderValidation per consentire Content-Type intestazioni non conformi agli standard
  • Aggiunto il parametro -Form per fornire supporto semplificato a multipart/form-data.
  • Gestione conforme senza distinzione tra maiuscole e minuscole delle chiavi di relazione
  • Aggiunta del parametro -Resume per i cmdlet web

Invoke-RestMethod restituisce informazioni utili quando non vengono restituiti dati

Quando un'API restituisce solo null, Invoke-RestMethod serializzava questa stringa come stringa "null" anziché $null. Questa modifica fissa la logica in Invoke-RestMethod per serializzare correttamente un letterale JSON null valido a valore singolo come $null.

I cmdlet Web avvisano quando -Credential vengono inviati su connessioni non crittografate

Quando si usa HTTP, il contenuto incluso le password viene inviato come testo non crittografato. Questa modifica non consente questa impostazione per impostazione predefinita e restituisce un errore se le credenziali vengono passate in modo non sicuro. Gli utenti possono bypassare questo sistema utilizzando lo -AllowUnencryptedAuthentication switch.

Rendere il parametro -OutFile nei cmdlet web per funzionare come -LiteralPath

A partire da PowerShell 7.1, il parametro OutFile dei cmdlet Web funziona come LiteralPath e non elabora caratteri jolly.

Modifiche api

Rimuovi AddTypeCommandBase classe

La AddTypeCommandBase classe fu rimossa Add-Type per migliorare le prestazioni. Questa classe viene usata solo dal Add-Type cmdlet e non deve influire sugli utenti.

Rimossa VisualBasic come lingua supportata in Add-Type

In passato, si poteva compilare codice in Visual Basic usando il Add-Type cmdlet. Visual Basic veniva raramente utilizzato con Add-Type. Questa funzionalità è stata rimossa per ridurre le dimensioni di PowerShell.

Rimosso il supporto RunspaceConfiguration

In precedenza, quando si crea uno spazio di esecuzione di PowerShell a livello di codice usando l'API, è possibile usare le classi legacy RunspaceConfiguration o più recenti InitialSessionState . Questa modifica ha rimosso il supporto per RunspaceConfiguration e supporta InitialSessionStatesolo .

CommandInvocationIntrinsics.InvokeScript associare gli argomenti a $input invece di $args

Una posizione errata di un parametro ha restituito gli argomenti passati come input anziché come argomenti.

Rimuovere ClrVersion e BuildVersion proprietà da $PSVersionTable

La ClrVersion proprietà di $PSVersionTable non è utile con CoreCLR. Gli utenti finali non devono usare tale valore per determinare la compatibilità.

La BuildVersion proprietà è stata associata alla versione di compilazione di Windows, che non è disponibile nelle piattaforme non Windows. Usare la GitCommitId proprietà per recuperare la versione di compilazione esatta di PowerShell.

Implementare l'analisi di escape Unicode

`u#### oppure `u{####} viene convertito nel corrispondente carattere Unicode. Per produrre un letterale `u, sfuggi dal backtick: ``u.

Problema di associazione dei parametri con ValueFromRemainingArguments nelle funzioni PS

ValueFromRemainingArguments ora restituisce i valori come un array invece che un singolo valore che a sua volta è un array.

Usi ripuliti di CommandTypes.Workflow e WorkflowInfoCleaned

Pulire il codice correlato agli usi di CommandTypes.Workflow e WorkflowInfo in System.Management.Automation.

Queste lievi modifiche importanti influiscono principalmente sul codice del provider di aiuto.

  • Modificare i costruttori pubblici di WorkflowInfo in interni. Non è più supportato il flusso di lavoro, quindi è opportuno non consentire agli utenti di creare Workflow istanze.
  • Rimuovere il tipo System.Management.Automation.DebugSource perché viene usato solo per il debug del flusso di lavoro.
  • Rimuovere l'overload di SetParent dalla classe astratta Debugger usato solo per il debug del flusso di lavoro.
  • Rimuovere lo stesso overload di SetParent dalla classe derivata RemotingJobDebugger.

Non incapsulare il risultato restituito in PSObject quando si converte un ScriptBlock in un delegato

Quando a ScriptBlock viene convertito in un tipo delegato da usare nel contesto C#, avvolgere il risultato in a PSObject porta a problemi inutili:

  • Quando il valore viene convertito nel tipo di ritorno delegato, il PSObject viene essenzialmente srotolato. Quindi non PSObject è necessario.
  • Quando il tipo di ritorno delegato è object, viene avvolto in un PSObject , rendendo difficile lavorarci in codice C#.

Dopo questo cambiamento, l'oggetto restituito diventa l'oggetto sottostante.

Supporto remoto

La comunicazione remota di PowerShell (PSRP) con WinRM non è supportata per le piattaforme non Windows. È possibile usare PowerShell Remoting (PSRP) tramite WinRM da Windows per connettersi ad altri computer Windows. PowerShell supporta anche la comunicazione remota su SSH in tutte le piattaforme (Windows, macOS e Linux). Per altre informazioni, vedere Comunicazione remota SSH in PowerShell.

PowerShell Direct per contenitori tenta di usare pwsh prima

PowerShell Direct è una funzionalità di PowerShell e Hyper-V che permette di connettersi a una VM o a un container Hyper-V senza connettività di rete o altri servizi di gestione remota.

In passato, PowerShell Direct è connesso usando l'istanza predefinita di Windows PowerShell nel contenitore. Ora, PowerShell Direct tenta prima di connettersi usando qualsiasi variabile disponibile pwsh.exe sull'ambiente PATH . Se pwsh.exe non è disponibile, PowerShell Direct torna a usare powershell.exe.

Enable-PSRemoting ora crea endpoint remoting separati per le versioni di anteprima

Enable-PSRemoting Ora crea due configurazioni di sessione remoto:

  • Uno per la versione principale di PowerShell. Ad esempio: PowerShell.6. Questo endpoint che può essere basato su aggiornamenti di versione secondaria come configurazione della sessione di PowerShell 6 "a livello di sistema"
  • Una configurazione di sessione specifica per versione, ad esempio: PowerShell.6.1.0

Questo comportamento è utile se si vogliono installare più versioni di PowerShell 6 e accessibili nello stesso computer.

Inoltre, le versioni preview di PowerShell ora ottengono le proprie configurazioni di sessione remota dopo aver eseguito il Enable-PSRemoting cmdlet:

C:\WINDOWS\system32> Enable-PSRemoting

L'output potrebbe essere diverso se non è stato configurato WinRM in precedenza.

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

È quindi possibile visualizzare configurazioni di sessione di PowerShell separate per l'anteprima e le build stabili di PowerShell 6 e per ogni versione specifica.

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 sintassi supportata per SSH

I client SSH tipicamente supportano una stringa di connessione nel formato user@host:port. Con l'aggiunta di SSH come protocollo per la comunicazione remota di PowerShell, è stato aggiunto il supporto per questo formato di stringa di connessione:

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

I dati di telemetria possono essere disabilitati solo con una variabile di ambiente

PowerShell invia dati di telemetria di base a Microsoft al momento dell'avvio. I dati includono il nome del sistema operativo, la versione del sistema operativo e la versione di PowerShell. Questi dati consentono di comprendere meglio gli ambienti in cui viene usato PowerShell e di assegnare priorità alle nuove funzionalità e alle correzioni.

Per rifiutare esplicitamente questa telemetria, impostare la variabile di ambiente POWERSHELL_TELEMETRY_OPTOUT su true, yeso 1. Non supportiamo più la cancellazione del file DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY per disabilitare la telemetria.