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 in 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. È possibile apportare modifiche di rilievo in .NET che influiscono su PowerShell.

  • PowerShell 7.5 - Basato su .NET 9.0
  • PowerShell 7.4 - Basato su .NET 8.0
  • PowerShell 7.3 - Basato su .NET 7.0
  • PowerShell 7.2 (LTS-current): basato su .NET 6.0 (LTS-current)
  • PowerShell 7.1 - Basato su .NET 5.0
  • PowerShell 7.0 (LTS): 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 ulteriori informazioni:

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 [System.String]::Split() metodo che non sono disponibili in .NET Framework 4.5. L'elenco seguente mostra gli overload per il Split() metodo disponibile 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 Split() metodo 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 all'overload corretto, è necessario digitare il cast della stringa a una matrice 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

Flusso di lavoro PowerShell è una funzionalità di Windows PowerShell basata su Windows Workflow Foundation (WF) che consente di creare runbook affidabili per le attività di lunga durata o parallelizzate.

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, è prevista l'abilitazione di parallelismo/concorrenza nativi nel linguaggio di PowerShell senza la necessità di Flusso di lavoro PowerShell.

Se è necessario usare i checkpoint per riprendere uno script dopo il riavvio del sistema operativo, è consigliabile usare il componente Utilità di pianificazione per eseguire uno script all'avvio del sistema operativo, ma lo script deve mantenere il proprio stato, ad esempio con il salvataggio permanente 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 cimCmdlets (noto anche come WMI v2) eseguono la stessa funzione e forniscono nuove funzionalità e una sintassi riprogettata.

Cmdlet New-WebServiceProxy rimosso

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

Cmdlet *-Transaction rimossi

Questi cmdlet hanno un utilizzo molto limitato. È stata presa la decisione di interromperne il supporto.

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

Cmdlet di *-EventLog

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 gli eventi in 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 (Desired State Configuration)

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.

Altre modifiche di pwsh(.exe) rispetto a powershell.exe:

  • Modificato il primo parametro posizionale da -Command a -File. Questa modifica corregge l'uso di #! (noto anche come shebang) negli script di PowerShell che vengono eseguiti da shell non di PowerShell su piattaforme non Windows. Significa anche che è possibile eseguire comandi come pwsh foo.ps1 o pwsh fooScript senza specificare -File. Tuttavia, questa modifica richiede di specificare in modo esplicito -c o -Command quando si tenta di 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.
  • Modificati pwsh -version e la Guida incorporata per pwsh.exe per allinearli con altri strumenti nativi.
  • Messaggi di errore di argomento non validi per -File e -Command codici di uscita coerenti con gli standard Unix
  • Aggiunto il parametro -WindowStyle in Windows. Analogamente, gli aggiornamenti delle installazioni basate su pacchetti su piattaforme non Windows sono aggiornamenti sul posto.

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, l'uso di pwsh.exe per eseguire uno script di PowerShell usando -File non è possibile passare $true/$false come valori di parametro. È stato aggiunto il supporto di $true/$false come valori analizzati ai parametri. Sono supportati anche i valori switch.

Compatibilità migliorata con le versioni precedenti di Windows PowerShell

Per Windows, viene aggiunto un nuovo parametro opzionale UseWindowsPowerShell a Import-Module. Questa opzione crea un modulo proxy in PowerShell 7 che usa un processo di Windows PowerShell locale per eseguire in modo implicito tutti i cmdlet contenuti nel modulo. Per altre informazioni, vedere Import-Module.

Per altre informazioni sui moduli Microsoft che funzionano con PowerShell 7.0, vedere Tabella di compatibilità dei moduli.

Supporto di Microsoft Update per Windows

PowerShell 7.2 ha aggiunto il supporto per Microsoft Update. Quando si abilita questa funzionalità, si otterranno gli aggiornamenti più recenti di PowerShell 7 nel flusso di gestione tradizionale di Windows Update (WU), indipendentemente dal fatto che si tratti di Windows Update for Business, WSUS, SCCM o la finestra di dialogo interattiva wu in Impostazioni.

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

  • USE_MU - Questa proprietà ha due valori possibili:
    • 1 (impostazione predefinita) - Opta per l'aggiornamento tramite Microsoft Update o WSUS
    • 0 - Non acconsentire esplicitamente all'aggiornamento tramite Microsoft Update o WSUS
  • ENABLE_MU
    • 1(impostazione predefinita) - Acconsente esplicitamente all'uso del Aggiornamenti automatico o di Windows Update
    • 0- Non acconsentire esplicitamente all'uso di Microsoft Update il Aggiornamenti automatico o Windows Update

Modifiche del motore

Supportare PowerShell come shell Unix predefinita

In Unix, l'accettazione di -i per una shell interattiva è una convenzione per le shell e molti strumenti si aspettano questo comportamento (script ad esempio e quando si imposta PowerShell come la shell predefinita) e chiamano la shell con l'opzione -i. Questa modifica è significativa, perché -i si poteva usare in precedenza come forma breve di -inputformat, mentre è ora necessario specificare -in.

Snap-in personalizzati

Gli snap-in PowerShell sono predecessori dei moduli PowerShell che non sono stati adottati diffusamente 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

Supporto abilitato per PowerShell 6.2 per le funzionalità sperimentali. Ciò consente agli sviluppatori di PowerShell di offrire nuove funzionalità e ottenere commenti e suggerimenti prima di completare la progettazione. In questo modo si evita l'introduzione di modifiche che causano un'interruzione con l'evolversi della progettazione.

Usare Get-ExperimentalFeature per ottenere un elenco delle funzionalità sperimentali disponibili. È possibile 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 tipo di elemento di tipo valore

Per il parametro Mandatory e gli attributi ValidateNotNull e ValidateNotNullOrEmpty, ignorare il controllo degli elementi Null se il tipo di elemento della raccolta è un tipo valore.

Mantieni $? per ParenExpression, SubExpression e ArrayExpression

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

Correzione $? di non essere $false quando il comando nativo scrive in stderr

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

Non $ErrorActionPreference influire sull'output stderr dei comandi nativi

È comune che i comandi nativi vengano scritti in stderr senza voler indicare un errore. Con questa modifica, stderr l'output viene ancora acquisito negli oggetti ErrorRecord, ma il runtime non viene più applicato $ErrorActionPreference se ErrorRecordproviene da un comando nativo.

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

La codifica precedente, ASCII (7 bit), comporterebbe la modifica non corretta 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.

Unify cmdlets with parameter -Encoding to be of type System.Text.Encoding

Il valore -EncodingByte è stato rimosso dai cmdlet per il provider filesystem. Viene ora usato un nuovo parametro, -AsByteStream, per specificare che un flusso di byte è richiesto come input o che l'output è un flusso di byte.

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

In precedenza, New-ModuleManifest crea psd1 manifesti in UTF-16 con bom, creando un problema per gli strumenti Linux. Questa modifica importante cambia la codifica di New-ModuleManifest in UTF (senza BOM) nelle 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 usati di frequente in cui la ricerca era più veloce.

-Verbose e -Debug non esegue più l'override $ErrorActionPreference

In precedenza, specificando -Verbose o -Debug veniva eseguito l'override del comportamento di $ErrorActionPreference. Con questa modifica, -Verbose e -Debug non influiscono più sul comportamento di $ErrorActionPreference.

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

Apportare $PSCulture modifiche coerenti alle impostazioni cultura nella sessione

In Windows PowerShell il valore delle impostazioni cultura corrente viene memorizzato nella cache, che può consentire la sincronizzazione del valore con le impostazioni cultura viene modificato dopo l'avvio della sessione. Questo comportamento di memorizzazione nella cache è stato risolto nel core di PowerShell.

Consenti al parametro denominato specificato in modo esplicito di sostituire lo stesso parametro dallo splatting della tabella hash

Con questa modifica, i parametri denominati dalla splatting vengono spostati alla fine dell'elenco di parametri in modo che vengano associati dopo che tutti i parametri denominati specificati in modo esplicito sono associati. L'associazione di parametri per funzioni semplici non genera un errore quando non è possibile trovare un parametro denominato specificato. I parametri denominati sconosciuti sono associati al $args parametro della funzione semplice. Lo spostamento dello splatting alla fine dell'elenco di argomenti modifica l'ordine in cui i parametri vengono visualizzati in $args.

Ad 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 riempito in '$args' insieme a Blah = "World"

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

Con questa modifica, gli argomenti di @hash vengono spostati alla fine dell'elenco di 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 non 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 non 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

Nota

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. Pertanto, è necessario usare {} per i nomi delle variabili, ad esempio ${a}, o quando ? è incluso nel nome della variabile ${a?}.

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]

Nota

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.

Aggiunta & dell'operatore per il controllo del processo

Il posizionamento di & alla fine di una pipeline causa l'esecuzione della pipeline come processo di PowerShell. Quando una pipeline è supportata da un background, viene restituito un oggetto processo. Quando la pipeline è in esecuzione come processo, tutti i cmdlet *-Job standard possono essere usati per gestire il processo. Le variabili usate nella pipeline, ignorando quelle specifiche del processo, vengono copiate automaticamente nel processo in modo tale che Copy-Item $foo $bar & funzioni. Il processo viene inoltre eseguito nella directory corrente anziché nella home directory dell'utente.

Nuovi metodi e proprietà per PSCustomObject

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

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

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Questa attività include inoltre i metodi ForEach e Where, che consentono di usare e filtrare gli elementi PSCustomObject:

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

Conversioni da PSMethod in delegato

È possibile convertire un oggetto PSMethod in un delegato. Ciò consente di eseguire operazioni come il passaggio del 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 tra stringhe modificato in PowerShell 7.1

PowerShell 7.1 è basato su .NET 5.0, che ha introdotto la modifica di rilievo seguente:

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

Ad esempio, le due stringhe seguenti vengono considerate identiche:

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

Nuovi cmdlet

Nuovo cmdlet Get-Uptime

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

Nuovo cmdlet Remove-Alias

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

Nuovo cmdlet Remove-Service

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

Nuovi cmdlet Markdown

Il markdown è uno standard per la creazione di documenti di testo normale leggibili con formattazione di base di cui si può eseguire il rendering in HTML.

In PowerShell 6.1 sono stati aggiunti i cmdlet seguenti:

Nuovo cmdlet Test-Json

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 cmdlet Join-String

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 nuovo 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 visualizzazioni possono essere selezionate dall'utente tramite la variabile di preferenza $ErrorView.

In ConciseView, se un errore non è dovuto a un errore di script o parser, viene visualizzato un messaggio di errore a riga singola:

Get-Childitem -Path c:\NotReal
Get-ChildItem: Cannot find path 'C:\NotReal' because it does not 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 le sequenze di escape dei colori ANSI (VT100), i colori non vengono visualizzati.

La visualizzazione predefinita in PowerShell 7 è ConciseView. La visualizzazione predefinita precedente era NormalView ed è possibile selezionare questa opzione impostando la variabile di preferenza $ErrorView.

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

Nota

Una nuova proprietà ErrorAccentColor è stata aggiunta a $Host.PrivateData per supportare la modifica del colore principale del messaggio di errore.

Il nuovo Get-Errorcmdlet fornisce una visualizzazione dettagliata completa dell'errore completo quando si desidera. Per impostazione predefinita, il cmdlet visualizza i dettagli completi, incluse le eccezioni interne, dell'ultimo errore che si è verificato.

Il cmdlet Get-Error supporta l'input dalla pipeline tramite la variabile incorporata $Error. Get-Error visualizza tutti gli errori delle pipeline.

$Error | Get-Error

Il cmdlet Get-Error supporta il parametro Newest e consente di specificare il numero di errori della sessione corrente che si vuole visualizzare.

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

Per altre informazioni, vedere Get-Error.

Modifiche dei 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 .

Per impostazione predefinita, i blocchi di script paralleli usano la directory di lavoro corrente del chiamante che ha avviato le attività parallele.

Questo esempio recupera 50.000 voci di log da 5 registri di sistema in un computer 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 di script eseguito in parallelo per ogni nome di registro di input.

Il nuovo parametro ThrottleLimit limita il numero di blocchi di script in esecuzione in parallelo in un determinato momento. L'impostazione predefinita è 5.

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

Per altre informazioni, vedere ForEach-Object.

Verificare in system32 se sono disponibili moduli predefiniti compatibili in 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 solo i moduli a Get-Module e Import-Module se i relativi CompatiblePSEdition sono contrassegnati come compatibili con Core.

Si può eseguire l'override di questo comportamento con il parametro opzionale -SkipEditionCheck in modo da visualizzare tutti i moduli. È stata anche aggiunta una proprietà PSEdition all'output della tabella.

Alias -lp per tutti i parametri -LiteralPath

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

Correzione Get-Item -LiteralPath a*b se a*b in realtà non esiste per restituire l'errore

In precedenza, -LiteralPath con un carattere jolly specificato veniva considerato uguale a -Path e se il carattere jolly non trovava alcun file, il cmdlet veniva chiuso senza messaggi. Il comportamento corretto prevede che -LiteralPath sia un valore letterale in modo che generi un errore se il file non esiste. La modifica consiste nel considerare i caratteri jolly usati con -Literal come valore 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

A causa di problemi con la comunicazione remota RPC in CoreFX (in particolare nelle piattaforme non Windows) e per garantire un'esperienza coerente di comunicazione remota in PowerShell, il parametro -Protocol è stato rimosso dai cmdlet \*-Computer. DCOM non è più supportato per la comunicazione remota. I cmdlet seguenti supportano solo la comunicazione remota WS-Management:

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

Rimuovere -ComputerName dai *-Service cmdlet

Per favorire l'uso coerente di PSRP, il parametro -ComputerName è stato rimosso dai cmdlet *-Service.

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

In precedenza, l'output durante l'uso di Get-Content -Delimiter era incoerente e poco pratico, perché richiedeva ulteriori elaborazioni dei dati per rimuovere il delimitatore. Questa modifica rimuove il delimitatore nelle righe restituite.

Modifiche apportate a Format-Hex

Il parametro -Raw è ora "no-op" (in quanto non esegue alcuna operazione). L'avanzamento di tutto l'output viene visualizzato con una rappresentazione vera dei numeri che include tutti i byte per il relativo tipo. Questo è ciò che il -Raw parametro stava eseguendo prima di questa modifica.

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

BiosSerialNumber era digitata in modo errato come BiosSeralNumber ed è stata corretta.

Aggiungere Get-StringHash cmdlet e Get-FileHash

Questa modifica riguarda alcuni algoritmi di hash non supportati da CoreFX, che pertanto non sono più disponibili:

  • MACTripleDES
  • RIPEMD160

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

Il passaggio di $null a uno qualsiasi dei cmdlet 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 cmdlet Import-Csv non poteva essere usato per importare direttamente i file di log in formato W3C esteso ed era necessaria un'azione aggiuntiva. Con questa modifica, il formato di log esteso W3C è ora supportato.

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

In precedenza, gli oggetti esportati usando Export-CSV con TypeInformation e importati con ConvertFrom-Csv non mantenevano le informazioni sui tipi. Questa modifica aggiunge le informazioni sui tipi al membro PSTypeNames 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.

Usare -IncludeTypeInformation per mantenere il comportamento precedente.

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

In precedenza, -LiteralPath con un carattere jolly specificato veniva considerato uguale a -Path e se il carattere jolly non trovava alcun file, il cmdlet veniva chiuso senza messaggi. Il comportamento corretto prevede che -LiteralPath sia un valore letterale in modo che generi un errore se il file non esiste. La modifica consiste nel considerare i caratteri jolly usati con -Literal come valore letterale.

Group-Object ordina ora i gruppi

Come parte del miglioramento delle prestazioni, Group-Object ora restituisce un elenco ordinato dei gruppi. Anche se è consigliabile non fare affidamento sull'ordine, questa modifica potrebbe causare problemi se si volesse il primo gruppo. È stato deciso che valeva la pena introdurre questo miglioramento delle prestazioni perché l'impatto dell'eventuale dipendenza dal comportamento precedente è basso.

Deviazione standard in Measure-Object

L'output da Measure-Object ora include una StandardDeviation proprietà .

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 funzione more

In precedenza PowerShell rendeva disponibile in Windows la funzione more che eseguiva il wrapping di more.com. Tale funzione è stata ora rimossa.

Inoltre, la funzione help ora usa more.com in Windows o il pager predefinito del sistema specificato da $env:PAGER nelle piattaforme non Windows.

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

In precedenza, usando Set-Location o cd per tornare a un PSDrive, gli utenti tornavano al percorso predefinito per tale unità. Gli utenti vengono ora inviati all'ultima directory di lavoro corrente nota per la sessione.

cd - consente di tornare alla directory precedente

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

O in Linux:

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

Inoltre cd e cd -- diventano $HOME.

Update-Help come non amministratore

A grande richiesta, Update-Help non deve più essere eseguito come amministratore. Update-Help ora per impostazione predefinita salva la Guida in una cartella con ambito di 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 per cui non sono definiti servizi dipendenti:

Get-Service | Where-Object -Not DependentServices

Modifiche ai cmdlet Web

L'API .NET sottostante dei cmdlet Web è stato modificata in System.Net.Http.HttpClient. Questa modifica offre numerosi vantaggi. Tuttavia, questa modifica insieme a una mancanza di interoperabilità con Internet Explorer ha dato luogo a diverse modifiche di rilievo all'interno di Invoke-WebRequest e Invoke-RestMethod.

  • Invoke-WebRequest ora supporta solo l'analisi HTML di base. Invoke-WebRequest restituisce sempre un oggetto BasicHtmlWebResponseObject. Le proprietà ParsedHtml e Forms sono state rimosse.
  • I valori BasicHtmlWebResponseObject.Headers sono ora String[] invece di String.
  • BasicHtmlWebResponseObject.BaseResponse è ora un oggetto System.Net.Http.HttpResponseMessage.
  • La proprietà Response per le eccezioni di cmdlet Web è ora un oggetto System.Net.Http.HttpResponseMessage.
  • L'analisi delle intestazioni conforme a RFC è ora l'impostazione predefinita per il parametro -Headers e -UserAgent. Questa impostazione può essere ignorata con -SkipHeaderValidation.
  • Gli schemi URI file:// e ftp:// non sono più supportati.
  • Le impostazioni di System.Net.ServicePointManager non vengono più rispettate.
  • Non è attualmente disponibile l'autenticazione basata su certificati in macOS.
  • L'uso di -Credential su un URI http:// genererà un errore. Usare un URI https:// oppure specificare il parametro -AllowUnencryptedAuthentication per eliminare l'errore.
  • -MaximumRedirection genera ora un errore fatale quando i tentativi di reindirizzamento superano il limite specificato anziché restituire i risultati dell'ultimo reindirizzamento.
  • In PowerShell 6.2 è stata apportata una modifica all'impostazione predefinita della codifica UTF-8 per le risposte JSON. Quando non viene specificato un set di caratteri per una risposta JSON la codifica predefinita deve essere UTF-8, in base alla specifica RFC 8259.
  • Codifica predefinita impostata su UTF-8 per application-json le risposte
  • Aggiunta -SkipHeaderValidation del parametro per consentire Content-Type intestazioni non conformi agli standard
  • Aggiunta -Form del parametro per supportare il supporto semplificato multipart/form-data
  • Gestione conforme senza distinzione tra maiuscole e minuscole delle chiavi di relazione
  • Aggiunta del -Resume parametro 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 consente di correggere la logica in Invoke-RestMethod per serializzare correttamente un singolo valore letterale valido JSON null come $null.

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

Quando si usa HTTP, il contenuto che include 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 ignorare questa nuova impostazione usando l'opzione -AllowUnencryptedAuthentication.

Impostare -OutFile il parametro 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 i caratteri jolly.

Modifiche API

Rimuovi AddTypeCommandBase classe

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

Rimosso VisualBasic come linguaggio supportato in Add-Type

In passato era possibile compilare il codice Visual Basic usando il cmdlet Add-Type. Visual Basic veniva usato raramente con Add-Type. Questa funzionalità è stata rimossa per ridurre le dimensioni di PowerShell.

Rimozione del RunspaceConfiguration supporto

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 . Con questa modifica viene rimosso il supporto per RunspaceConfiguration ed è ora supportata solo la classe InitialSessionState.

CommandInvocationIntrinsics.InvokeScriptassociare argomenti a anziché a $input$args

A causa della posizione non corretta di un parametro, gli argomenti vengono passati come input invece che 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#### o `u{####} viene convertito nel carattere Unicode corrispondente. Per restituire un valore letterale `u, usare il carattere di escape per l'apice inverso: ``u.

Problema di associazione dei parametri con ValueFromRemainingArguments nelle funzioni PS

ValueFromRemainingArguments restituisce ora i valori come matrice anziché come valore singolo che è a sua volta una matrice.

Pulizia di CommandTypes.Workflow e WorkflowInfoCleaned

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

Queste piccole modifiche di rilievo influiscono principalmente sul codice del provider della Guida.

  • Modificare i costruttori pubblici di in WorkflowInfo interno. 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 utilizzato solo per il debug del flusso di lavoro.
  • Rimuovere lo stesso overload di SetParent dalla classe derivata RemotingJobDebugger.

Non eseguire il wrapping del risultato restituito durante la conversione di un oggetto ScriptBlock in PSObject un delegato

Quando un oggetto ScriptBlock viene convertito in un tipo delegato da usare nel contesto C#, il wrapping del risultato comporta PSObject problemi non necessario:

  • Quando il valore viene convertito nel tipo restituito del delegato, viene essenzialmente annullato il PSObject wrapping. Quindi il PSObject non è necessario.
  • Quando il tipo restituito del delegato è object, viene eseguito il wrapping in un PSObject elemento che rende difficile lavorare con nel codice C#.

Dopo questa modifica, l'oggetto restituito è l'oggetto sottostante.

Supporto della comunicazione remota

La comunicazione remota di PowerShell (PSRP) con WinRM nelle piattaforme Unix richiede NTLM/Negotiate o Autenticazione di base su HTTPS. PSRP in macOS supporta solo l'autenticazione di base su HTTPS. L'autenticazione basata su Kerberos non è supportata per le piattaforme non Windows.

PowerShell supporta anche la comunicazione remota di PowerShell (PSRP) 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 consente di connettersi a una macchina virtuale Hyper-V o contenitore senza connettività di rete o altri servizi di gestione remota.

In passato, PowerShell Direct si connetteva usando l'istanza di Windows PowerShell predefinita nel contenitore. Ora PowerShell Direct per prima cosa tenta di connettersi usando qualsiasi variabile pwsh.exe nella variabile di ambiente PATH. Se pwsh.exe non è disponibile, PowerShell Direct esegue il fallback per usare powershell.exe.

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

Enable-PSRemoting ora crea due configurazioni della sessione di comunicazione remota:

  • Una per la versione principale di PowerShell. Ad esempio: PowerShell.6. Questo endpoint può essere usato come base per gli aggiornamenti di versioni secondarie come configurazione di sessione di PowerShell 6 "a livello di sistema"
  • Una configurazione di sessione specifica della versione, ad esempio: PowerShell.6.1.0

Questo comportamento è utile se si prevede di avere più versioni di PowerShell 6 installate e accessibili nello stesso computer.

Inoltre, le versioni di anteprima di PowerShell ora ottengono le proprie configurazioni di sessione remota dopo l'esecuzione del cmdlet Enable-PSRemoting:

C:\WINDOWS\system32> Enable-PSRemoting

L'output può essere diverso se prima non è stato configurato WinRM.

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

Sintassi di user@host:port supportata per SSH

I client SSH in genere 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 della stringa di connessione:

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

La telemetria può essere disabilitata solo con una variabile di ambiente

PowerShell invia dati di telemetria di base a Microsoft all'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 si usa PowerShell e di assegnare priorità alle nuove funzionalità e correzioni.

Per rifiutare esplicitamente questa telemetria, impostare la variabile di ambiente POWERSHELL_TELEMETRY_OPTOUT su true, yes o 1. Non è più supportata l'eliminazione del file DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY per disabilitare la telemetria.