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.
- Novità di PowerShell 7.5
- Novità di PowerShell 7.4
- Novità di PowerShell 7.3
- Novità di PowerShell 7.2
- Novità di PowerShell 7.1
- Novità di PowerShell 7.0
- Novità di PowerShell 6.x
.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 comepwsh foo.ps1
opwsh fooScript
senza specificare-File
. Tuttavia, questa modifica richiede di specificare in modo esplicito-c
o-Command
quando si tenta di eseguire comandi comepwsh.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
dapwsh.exe
. - Modificati
pwsh -version
e la Guida incorporata perpwsh.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 WSUS0
- 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 Update0
- 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 ErrorRecord proviene 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 -Encoding
Byte
è 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:
- 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 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-Error
cmdlet 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-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
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 oggettoBasicHtmlWebResponseObject
. Le proprietàParsedHtml
eForms
sono state rimosse.- I valori
BasicHtmlWebResponseObject.Headers
sono oraString[]
invece diString
. BasicHtmlWebResponseObject.BaseResponse
è ora un oggettoSystem.Net.Http.HttpResponseMessage
.- La proprietà
Response
per le eccezioni di cmdlet Web è ora un oggettoSystem.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://
eftp://
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 URIhttp://
genererà un errore. Usare un URIhttps://
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 consentireContent-Type
intestazioni non conformi agli standard - Aggiunta
-Form
del parametro per supportare il supporto semplificatomultipart/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.InvokeScript
associare 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 creareWorkflow
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 ilPSObject
non è necessario. - Quando il tipo restituito del delegato è
object
, viene eseguito il wrapping in unPSObject
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.