Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 su piattaforme non Windows a causa delle differenze nei framework. Per altre informazioni sulle modifiche in .NET Core, vedere Modifiche di rilievo per la migrazione da .NET Framework a .NET Core.
Ogni nuova versione di PowerShell è basata su una versione più recente di .NET. Ci possono essere modifiche rompenti in .NET che influiscono su PowerShell.
- PowerShell 7.6 - Basato su .NET 10.0 (LTS)
- PowerShell 7.5 - Basato su .NET 9.0
- PowerShell 7.4 - Basato su .NET 8.0 (LTS)
- PowerShell 7.3 - Basato su .NET 7.0
- PowerShell 7.2 - Basato su .NET 6.0 (LTS)
- PowerShell 7.1 - Basato su .NET 5.0
- PowerShell 7.0 - Basato su .NET Core 3.1 (LTS)
- PowerShell 6.2 - Basato su .NET Core 2.1
- PowerShell 6.1 - Basato su .NET Core 2.1
- PowerShell 6.0 - Basato su .NET Core 2.0
Con l'avvento di .NET Standard 2.0, PowerShell può caricare molti moduli tradizionali di Windows PowerShell senza modifiche. PowerShell 7 include inoltre una funzionalità di compatibilità di Windows PowerShell che consente di usare moduli di Windows PowerShell che richiedono ancora il framework completo.
Per altre informazioni, vedere:
Tenere presente le modifiche apportate ai metodi .NET
Anche se le modifiche ai metodi .NET non sono specifiche di PowerShell, possono influire sugli script, soprattutto se si chiamano direttamente i metodi .NET. Potrebbero inoltre essere presenti nuovi overload per i costruttori. Ciò può avere un impatto sul modo in cui si creano oggetti usando New-Object o il [type]::new() metodo .
Ad esempio, .NET ha aggiunto overload al metodo [System.String]::Split() che non sono disponibili in .NET Framework 4.5. L'elenco seguente mostra gli overload per il metodo Split() disponibili in Windows PowerShell 5.1.
PS> "".Split
OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)
L'elenco seguente mostra gli overload per il Split() metodo disponibile in PowerShell 7:
"".Split
OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)
In Windows PowerShell 5.1, è possibile passare una matrice di caratteri (char[]) al metodo Split() come string. Il metodo divide la stringa di destinazione in qualsiasi occorrenza di un carattere nella matrice. Il comando seguente suddivide la stringa di destinazione in Windows PowerShell 5.1, ma non in PowerShell 7:
# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333
Per eseguire l'associazione alla corretta funzione overload, è necessario eseguire il cast della stringa a un array di caratteri.
# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333
I moduli non vengono più forniti con PowerShell
Per diversi motivi di compatibilità, i moduli seguenti non sono più inclusi in PowerShell.
- ISE
- Microsoft.PowerShell.LocalAccounts
- Microsoft.PowerShell.ODataUtils
- Microsoft.PowerShell.Operation.Validation
- PSScheduledJob
- PSWorkflow
- PSWorkflowUtility
Flusso di lavoro PowerShell
PowerShell Workflow è una funzionalità di Windows PowerShell che si basa su Windows Workflow Foundation (WF) e consente la creazione di runbook robusti per compiti di lunga durata o parallelizzati.
A causa della mancanza di supporto per Windows Workflow Foundation in .NET Core, è stato rimosso il flusso di lavoro di PowerShell da PowerShell.
In futuro, si vuole abilitare il parallelismo nativo/concorrenza nel linguaggio PowerShell senza la necessità del flusso di lavoro di PowerShell.
Se è necessario usare i checkpoint per riprendere uno script dopo il riavvio del sistema operativo, è consigliabile usare l'Utilità di pianificazione per eseguire uno script all'avvio del sistema operativo, ma lo script deve mantenere il proprio stato (ad esempio per renderlo persistente in un file).
Cmdlet rimossi da PowerShell
Per i moduli inclusi in PowerShell, i cmdlet seguenti sono stati rimossi da PowerShell per vari motivi di compatibilità o l'uso di API non supportate.
CimCmdlets
Export-BinaryMiLog
Microsoft.PowerShell.Core
Add-PSSnapinExport-ConsoleGet-PSSnapinRemove-PSSnapinResume-JobSuspend-Job
Microsoft.PowerShell.Diagnostics
Export-CounterImport-Counter
Microsoft.PowerShell.Management
Add-ComputerCheckpoint-ComputerClear-EventLogComplete-TransactionDisable-ComputerRestoreEnable-ComputerRestoreGet-ComputerRestorePointGet-ControlPanelItemGet-EventLogGet-TransactionGet-WmiObjectInvoke-WmiMethodLimit-EventLogNew-EventLogNew-WebServiceProxyRegister-WmiEventRemove-ComputerRemove-EventLogRemove-WmiObjectReset-ComputerMachinePasswordRestore-ComputerSet-WmiInstanceShow-ControlPanelItemShow-EventLogStart-TransactionTest-ComputerSecureChannelUndo-TransactionUse-TransactionWrite-EventLog
Microsoft.PowerShell.Utility
Convert-StringConvertFrom-String
PSDesiredStateConfiguration
Disable-DscDebugEnable-DscDebugGet-DscConfigurationGet-DscConfigurationStatusGet-DscLocalConfigurationManagerPublish-DscConfigurationRemove-DscConfigurationDocumentRestore-DscConfigurationSet-DscLocalConfigurationManagerStart-DscConfigurationStop-DscConfigurationTest-DscConfigurationUpdate-DscConfiguration
Cmdlet WMI v1
I cmdlet WMI v1 seguenti sono stati rimossi da PowerShell:
Register-WmiEventSet-WmiInstanceInvoke-WmiMethodGet-WmiObjectRemove-WmiObject
I cmdlet del modulo CimCmdlets (detto anche WMI v2) svolgono la stessa funzione e offrono nuove funzionalità e una sintassi riprogettata.
New-WebServiceProxy Cmdlet rimosso
.NET Core non supporta Windows Communication Framework, che fornisce servizi per l'uso del protocollo SOAP. Questo cmdlet è stato rimosso perché richiede SOAP.
*-Transaction Cmdlets rimossi
Questi cmdlet hanno avuto un utilizzo molto limitato. La decisione è stata presa di interrompere il sostegno per loro.
Complete-TransactionGet-TransactionStart-TransactionUndo-TransactionUse-Transaction
*-EventLog cmdlet
A causa dell'uso di API non supportate, i *-EventLog cmdlet sono stati rimossi da PowerShell.
Get-WinEvent e New-WinEvent sono disponibili per ottenere e creare eventi su Windows.
Cmdlet che usano Windows Presentation Framework (WPF)
.NET Core 3.1 ha aggiunto il supporto per WPF, quindi la versione di PowerShell 7.0 ha ripristinato le funzionalità specifiche di Windows seguenti:
- Cmdlet
Show-Command - Cmdlet
Out-GridView - Parametro ShowWindow di
Get-Help
Modifiche di PowerShell DSC (Configurazione dello Stato Desiderato)
Invoke-DscResource è stata ripristinata come funzionalità sperimentale in PowerShell 7.0.
A partire da PowerShell 7.2, il modulo PSDesiredStateConfiguration è stato rimosso da PowerShell ed è stato pubblicato in PowerShell Gallery. Per altre informazioni, vedere l'annuncio nel blog del team di PowerShell.
Modifiche eseguibili di PowerShell
Rinominato powershell.exe in pwsh.exe
Il nome binario per PowerShell è stato modificato da powershell(.exe) a pwsh(.exe). Questa modifica offre agli utenti un modo deterministico per eseguire PowerShell nei computer e supportare installazioni side-by-side di Windows PowerShell e PowerShell.
Ulteriori modifiche da pwsh(.exe)powershell.exe:
- Cambiato il primo parametro posizionale da
-Commanda-File. Questa modifica corregge l'uso di#!(cioè come shebang) negli script PowerShell eseguiti da shell non PowerShell su piattaforme non Windows. Significa anche che puoi eseguire comandi comepwsh foo.ps1opwsh fooScriptsenza specificare-File. Tuttavia, questo cambiamento richiede che tu specifichi-cesplicitamente o-Command, quando provi a eseguire comandi comepwsh.exe -Command Get-Command. -
pwshaccetta 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
-ImportSystemModulese-PSConsoleFiledapwsh.exe. - Aiuto modificato
pwsh -Versione integrato perpwsh.exeallinearsi ad altri strumenti nativi. - Messaggi di errore di argomento non validi per
-Filee-Commande codici di uscita coerenti con gli standard Unix - Parametro aggiunto
-WindowStylesu Windows. Analogamente, gli aggiornamenti delle installazioni basate su pacchetti su piattaforme non Windows sono aggiornamenti in loco.
Il nome abbreviato è anche coerente con la denominazione delle shell in piattaforme non Windows.
Supporto per l'esecuzione di uno script di PowerShell con il parametro bool
In precedenza, usando pwsh.exe per eseguire uno script di PowerShell con -File, non c'era modo di passare $true/$false come valori di parametro. È stato aggiunto il supporto per $true/$false i valori come analizzato ai parametri. Anche i valori switch sono supportati.
Migliorata compatibilità retroattiva con Windows PowerShell
Per Windows, viene aggiunto un nuovo parametro di commutazione, UseWindowsPowerShell , a Import-Module. Questo switch crea un modulo proxy in PowerShell 7 che utilizza un processo PowerShell locale di Windows per eseguire implicitamente qualsiasi cmdlet contenuto in quel modulo. Per altre informazioni, vedere Import-Module.
Per maggiori informazioni su quali moduli Microsoft funzionano con PowerShell 7.0, consulta la Tabella di Compatibilità dei Moduli.
Supporto Microsoft Update per Windows
PowerShell 7.2 ha aggiunto il supporto per Microsoft Update. Quando abiliti questa funzione, riceverai gli ultimi aggiornamenti di PowerShell 7 nel tuo flusso di gestione tradizionale di Windows Update (WU), che sia tramite Windows Update for Business, WSUS, SCCM o la finestra interattiva WU nelle Impostazioni.
Il pacchetto PowerShell 7.2 MSI include le seguenti opzioni di riga di comando:
-
USE_MU- Questa proprietà ha due valori possibili:-
1(predefinito) - Accede ad aggiornare tramite Microsoft Update o WSUS -
0- Non acconsentire esplicitamente all'aggiornamento tramite Microsoft Update o WSUS
-
ENABLE_MU-
1(predefinito) - Sceglie di utilizzare Microsoft Update per gli Aggiornamenti Automatici o Windows Update -
0- Non acconsentire all'uso di Microsoft Update, Aggiornamenti Automatici o Windows Update
-
Modifiche del motore
Supportare il PowerShell come shell Unix predefinita
In Unix è una convenzione per le shell accettare -i per una shell interattiva, e molti strumenti prevedono questo comportamento (script, ad esempio, e quando si imposta PowerShell come shell predefinita) e chiamano la shell con l'opzione -i. Questa modifica si sta interrupponendo che -i prima poteva essere usata come abbreviazione per corrispondere -InputFormat, che ora deve essere -in.
Snap-in personalizzati
Gli snap-in di PowerShell sono un predecessore dei moduli di PowerShell che non hanno un'adozione diffusa nella community di PowerShell.
A causa della complessità del supporto degli snap-in e della mancanza di utilizzo nella community, non sono più supportati snap-in personalizzati in PowerShell.
Flag di funzionalità sperimentali
PowerShell 6.2 ha abilitato il supporto per le funzionalità sperimentali. In questo modo gli sviluppatori di PowerShell possono fornire nuove funzionalità e ricevere commenti e suggerimenti prima del completamento della progettazione. In questo modo si evitano modifiche di rilievo man mano che la progettazione si evolve.
Usalo Get-ExperimentalFeature per ottenere un elenco delle funzionalità sperimentali disponibili. Puoi abilitare o disabilitare queste funzionalità con Enable-ExperimentalFeature e Disable-ExperimentalFeature.
Caricare l'assembly dal percorso di base del modulo prima di provare a caricare dalla GAC
In precedenza, quando un modulo binario ha l'assembly del modulo nella GAC, è stato caricato l'assembly dalla GAC prima di provare a caricarlo dal percorso di base del modulo.
Ignorare il controllo degli elementi null per le raccolte con un elemento di tipo valore
Per i Mandatory parametri e ValidateNotNull attributi e ValidateNotNullOrEmpty , si salta il controllo dell'elemento nullo se il tipo di elemento della collezione è di tipo valore.
Mantieni $? per ParenExpression, SubExpression e ArrayExpression
Questa richiesta pull modifica il modo in cui si compilano sottopipeline (...), sottoespressioni $(...) ed espressioni di array @() in modo che $? non sia automaticamente vero. Il valore di $? dipende invece dal risultato della pipeline o delle istruzioni eseguite.
Risolvi $? per evitare che sia $false quando il comando nativo scrive su stderr
$? non è impostato su $false quando il comando nativo scrive in stderr. È comune che i comandi nativi scrivano su stderr senza voler indicare un errore.
$? è impostato su $false solo quando il comando nativo ha un codice di uscita diverso da zero.
Non far sì che $ErrorActionPreference influenzi l'output stderr dei comandi nativi
È comune che i comandi nativi scrivano su stderr senza l'intenzione di indicare un errore. Con questa modifica, stderr l'output viene ancora catturato negli oggetti ErrorRecord , ma l'esecuzione non si applica $ErrorActionPreference più se l'ErrorRecord proviene da un comando nativo.
Modificare $OutputEncoding per usare la UTF-8 NoBOM codifica anziché ASCII
La codifica precedente, ASCII (7 bit), provocherebbe un'alterazione errata dell'output in alcuni casi. L'impostazione UTF-8 NoBOM predefinita mantiene l'output Unicode con una codifica supportata dalla maggior parte degli strumenti e dei sistemi operativi.
Uniforma i cmdlet con il parametro -Encoding per essere di tipo System.Text.Encoding
Il -Encoding valore Byte è stato rimosso dai cmdlet del provider FileSystem. Un nuovo parametro, -AsByteStream, viene ora usato per specificare che è necessario un flusso di byte come input o che l'uscita è un flusso di byte.
Modificare la codifica New-ModuleManifest in UTF8NoBOM nelle piattaforme non Windows
In precedenza, New-ModuleManifest creava psd1 manifesti in UTF-16 con BOM, creando un problema per i strumenti Linux. Questa modifica rivoluzionaria modifica la codifica di New-ModuleManifest per diventare UTF (senza BOM) sulle piattaforme non Windows.
Rimuovere AllScope dalla maggior parte degli alias predefiniti
Per velocizzare la creazione dell'ambito, AllScope è stato rimosso dalla maggior parte degli alias predefiniti.
AllScope è stato lasciato per alcuni alias frequentemente usati dove la ricerca era più veloce.
-Verbose e -Debug non sovrascrive più $ErrorActionPreference
In precedenza, se -Verbose o -Debug venivano specificati, sovrascriveva il comportamento di $ErrorActionPreference. Con questo cambiamento, -Verbose e -Debug non influenzano più il comportamento di $ErrorActionPreference.
Inoltre, il -Debug parametro imposta $DebugPreference su Continue invece di Inquire.
Rendere $PSCulture coerentemente riflettente le modifiche alla cultura durante la sessione
In Windows PowerShell, il valore corrente delle impostazioni cultura viene memorizzato nella cache, il che può portare a una mancata sincronizzazione del valore quando le impostazioni cultura vengono modificate dopo l'avvio della sessione. Questo comportamento di memorizzazione nella cache è stato risolto nel core di PowerShell.
Consenti a un parametro nominato esplicitamente di sostituire lo stesso parametro nello "splatting" di una hashtable.
Con questa modifica, i parametri nominati derivati dallo splatting vengono spostati alla fine dell'elenco di parametri, in modo che siano associati dopo che tutti i parametri nominati specificati esplicitamente sono già stati associati. L'associazione di parametri per funzioni semplici non genera un errore quando non è possibile trovare un parametro denominato specificato. Parametri nominati sconosciuti sono legati al $args parametro della funzione semplice. Spostando lo splatting alla fine della lista degli argomenti, cambia l'ordine in cui i parametri appaiono in $args.
Per esempio:
function SimpleTest {
param(
$Name,
$Path
)
"Name: $Name; Path: $Path; Args: $args"
}
Nel comportamento precedente , MyPath non è associato a -Path perché è il terzo argomento nell'elenco di argomenti. ## Quindi finisce per essere infilato in '$args' insieme a Blah = "World"
PS> $hash = @{ Name = "Hello"; Blah = "World" }
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: ; Args: -Blah: World MyPath
Con questo cambiamento, gli argomenti da @hash vengono spostati alla fine della lista degli argomenti.
MyPath diventa il primo argomento nell'elenco, quindi è associato a -Path.
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: MyPath; Args: -Blah: World
Modifiche della lingua
Operatore null-coalescing ??
L'operatore di coalescenza di valori Null ?? restituisce il valore dell'operando di sinistra se non è Null.
In caso contrario, valuta l'operando di destra e ne restituisce il risultato. L'operatore ?? non valuta l'operando di destra se l'operando di sinistra restituisce un valore diverso da Null.
$x = $null
$x ?? 100
100
Nell'esempio seguente l'operando di destra non verrà valutato.
[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020
Operatore di assegnazione null-coalescing ??=
L'operatore di assegnazione null-coalescing ??= assegna il valore dell'operando di destra all'operando di sinistra solo se l'operando di sinistra restituisce Null. L'operatore ??= non valuta l'operando di destra se l'operando di sinistra restituisce un valore diverso da Null.
$x = $null
$x ??= 100
$x
100
Nell'esempio seguente l'operando di destra non verrà valutato.
[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020
Operatori condizionali null
Annotazioni
Questa funzionalità è stata spostata da sperimentale a mainstream in PowerShell 7.1.
Un operatore condizionale Null applica un accesso ai membri, ?., o l'accesso agli elementi, , ?[]al relativo operando solo se l'operando restituisce un valore diverso da Null; in caso contrario, restituisce Null.
Poiché in PowerShell ? può essere incluso nel nome della variabile, è necessario specificare formalmente il nome della variabile per usare questi operatori. Quindi è necessario usare {} intorno ai nomi delle variabili come ${a} o quando ? fa parte del nome ${a?}della variabile .
Nell'esempio seguente viene restituito il valore di PropName .
$a = @{ PropName = 100 }
${a}?.PropName
100
Nell'esempio seguente viene restituito null, senza tentare di accedere al nome del membro PropName.
$a = $null
${a}?.PropName
Analogamente, verrà restituito il valore dell'elemento.
$a = 1..10
${a}?[0]
1
E quando l'operando è Null, l'elemento non è accessibile e viene restituito Null.
$a = $null
${a}?[0]
Annotazioni
La sintassi del nome della variabile di ${<name>} non deve essere confusa con l'operatore $() di sottoespressione. Per altre informazioni, vedere la sezione Nome variabile di about_Variables.
Aggiunto l'operatore & per il controllo dei job
Posizionando & alla fine di una pipeline, la pipeline viene eseguita come un lavoro PowerShell. Quando una pipeline è in background, viene restituito un oggetto processo. Una volta che la pipeline è in esecuzione come un job, tutti i cmdlet standard *-Job possono essere utilizzati per gestire il job. Le variabili (ignorando quelle specifiche del processo) usate nella pipeline vengono automaticamente copiate nel lavoro quindi Copy-Item $foo $bar & funzionano e funzionano. Il processo viene eseguito anche nella directory corrente anziché nella home directory dell'utente.
Nuovi metodi/proprietà su PSCustomObject
Sono stati aggiunti nuovi metodi e proprietà a PSCustomObject.
PSCustomObject ora include una Count/Length proprietà come altri oggetti.
$PSCustomObject = [pscustomobject]@{foo = 1}
$PSCustomObject.Length
1
$PSCustomObject.Count
1
Questo lavoro include ForEach anche metodi Where che ti permettono di lavorare e filtrare gli PSCustomObject oggetti:
$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
1
Conversioni da PSMethod a delegato
È possibile convertire un oggetto PSMethod in un delegato. Questo ti permette di fare cose come passare PSMethod[M]::DoubleStrLen come valore delegato in [M]::AggregateString:
class M {
static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }
static [long] AggregateString([string[]] $values, [Func[string, int]] $selector) {
[long] $res = 0
foreach($s in $values){
$res += $selector.Invoke($s)
}
return $res
}
}
[M]::AggregateString((gci).Name, [M]::DoubleStrLen)
Comportamento del confronto di stringhe modificato in PowerShell 7.1
PowerShell 7.1 è costruito su .NET 5.0, che ha introdotto la seguente modifica interruttiva:
A partire da .NET 5.0, i confronti delle stringhe invarianti di cultura ignorano i caratteri di controllo non stampanti.
Ad esempio, le seguenti due stringhe sono considerate identiche:
# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True
I nuovi cmdlet
Il nuovo Get-Uptime cmdlet
Il cmdlet Get-Uptime restituisce il tempo trascorso dall'ultimo avvio del sistema operativo. Il cmdlet è stato introdotto in PowerShell 6.0.
Nuovo Remove-Alias cmdlet
Il cmdlet Remove-Alias rimuove un alias dalla sessione di PowerShell corrente. Il cmdlet è stato introdotto in PowerShell 6.0.
Nuovo Remove-Service cmdlet
Il cmdlet Remove-Service rimuove un servizio di Windows nel Registro di sistema e nel database del servizio. Il cmdlet Remove-Service è stato introdotto in PowerShell 6.0.
I nuovi cmdlet di Markdown
Markdown è uno standard per la creazione di documenti di testo non crittografato leggibili con formattazione di base di cui è possibile eseguire il rendering in HTML.
In PowerShell 6.1 sono stati aggiunti i cmdlet seguenti:
- ConvertFrom-Markdown : consente di convertire il contenuto di una stringa o di un file in un oggetto MarkdownInfo .
- Get-MarkdownOption : restituisce i colori e gli stili correnti usati per il rendering del contenuto Markdown nella console.
- Set-MarkdownOption : imposta i colori e gli stili usati per il rendering del contenuto Markdown nella console.
- Show-Markdown - Visualizza il contenuto markdown nella console o come HTML
Nuovo Test-Json cmdlet
Il cmdlet Test-Json verifica se una stringa è un documento JSON (JavaScript Object Notation) valido e può facoltativamente verificare che il documento JSON sia rispetto a uno schema specificato.
Questo cmdlet è stato introdotto in PowerShell 6.1
Nuovi cmdlet per supportare le funzionalità sperimentali
I cmdlet seguenti sono stati aggiunti in PowerShell 6.2 per supportare le funzionalità sperimentali.
Nuovo Join-String cmdlet
Il cmdlet Join-String combina gli oggetti della pipeline in una singola stringa. Questo cmdlet è stato aggiunto in PowerShell 6.2.
Nuova visualizzazione ConciseView e cmdlet Get-Error
PowerShell 7.0 migliora la visualizzazione dei messaggi di errore per migliorare la leggibilità degli errori interattivi e di script con una nuova visualizzazione predefinita , ConciseView. Le viste sono selezionabili dall'utente tramite la variabile $ErrorViewdi preferenza .
Con ConciseView, se un errore non deriva da uno script o da un parser, allora si tratta di un messaggio di errore di una sola riga:
Get-ChildItem -Path C:\NotReal
Get-ChildItem: Can't find path 'C:\NotReal' because it doesn't exist
Se l'errore si verifica durante l'esecuzione dello script o è un errore di analisi, PowerShell restituisce un messaggio di errore su più righe contenente l'errore, un puntatore e un messaggio di errore che mostra dove si trova l'errore in tale riga. Se il terminale non supporta sequenze di escape colore ANSI (VT100), allora i colori non vengono visualizzati.
La vista predefinita in PowerShell 7 è ConciseView. La precedente vista predefinita era NormalView e puoi selezionarla impostando la variabile $ErrorViewpreference .
$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView
Annotazioni
Viene aggiunta una nuova proprietà, ErrorAccentColor , $Host.PrivateData per supportare la modifica del colore d'accento del messaggio di errore.
Il nuovo Get-Errorcmdlet fornisce una visione completa e dettagliata dell'errore qualificato quando si desidera. Di default il cmdlet mostra tutti i dettagli, comprese le eccezioni interne, dell'ultimo errore avvenuto.
Il Get-Error cmdlet supporta input dalla pipeline usando la variabile $Errorintegrata .
Get-Error Mostra tutti gli errori di pip.
$Error | Get-Error
Il Get-Error cmdlet supporta il parametro Newest , permettendoti di specificare quanti errori della sessione corrente desideri che vengano visualizzati.
Get-Error -Newest 3 # Displays the lst three errors that occurred in the session
Per altre informazioni, vedere Get-Error.
Modifiche ai cmdlet
Esecuzione parallela aggiunta a ForEach-Object
A partire da PowerShell 7.0, il ForEach-Object cmdlet che esegue l'iterazione degli elementi in una raccolta ha ora un parallelismo predefinito con il nuovo parametro Parallel .
Di default, i blocchi di script paralleli utilizzano la directory di lavoro corrente del chiamante che ha avviato i compiti paralleli.
Questo esempio recupera 50.000 voci di log da 5 log di sistema su una macchina Windows locale:
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
$logEntries = $logNames | ForEach-Object -Parallel {
Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5
$logEntries.Count
50000
Il parametro Parallel specifica il blocco script che viene eseguito in parallelo per ogni nome di log di input.
Il nuovo parametro ThrottleLimit limita il numero di blocchi script che vengono eseguiti in parallelo in un dato momento. L'impostazione predefinita è 5.
Usa la $_ variabile per rappresentare l'oggetto di input corrente nel blocco di script. Usare il modificatore dell'ambito Using: per passare riferimenti a variabili al blocco di script in esecuzione.
Per altre informazioni, vedere ForEach-Object.
Controlla system32 la presenza di moduli integrati compatibili su Windows
Nell'aggiornamento di Windows 10 1809 e Windows Server 2019 è stato aggiornato un certo numero di moduli di PowerShell predefiniti per contrassegnarli come compatibili con PowerShell.
All'avvio di PowerShell, include $windir\System32 automaticamente come parte della PSModulePath variabile di ambiente. Tuttavia, espone i moduli solo a Get-Module e Import-Module se è CompatiblePSEdition contrassegnato come compatibile con Core.
Puoi sovrascrivere questo comportamento per mostrare tutti i moduli usando il parametro -SkipEditionCheck dello switch.
Abbiamo anche aggiunto una PSEdition proprietà all'output della tabella.
-lp alias per tutti -LiteralPath i parametri
È stato creato un alias -lp di parametro standard per tutti i cmdlet predefiniti di PowerShell con un -LiteralPath parametro .
Correggi Get-Item -LiteralPath a*b se a*b non esiste effettivamente, per restituire un errore
In precedenza, -LiteralPath dato che un wildcard lo trattava allo stesso modo e -Path se il jolly non trovava file, usciva silenziosamente. Il comportamento corretto dovrebbe essere letterale -LiteralPath , quindi se il file non esiste, dovrebbe dare un errore. Il cambiamento consiste nel trattare le carte jolly usate -Literal come letterale.
Impostare la directory di lavoro sulla directory corrente in Start-Job
Il Start-Job cmdlet usa ora la directory corrente come directory di lavoro per il nuovo processo.
Rimuovere -Protocol dai *-Computer cmdlet
Il -Protocol parametro è stato rimosso dai cmdlet seguenti:
Rename-ComputerRestart-ComputerStop-Computer
DCOM non è più supportato per la comunicazione remota. I cmdlet supportano solo la comunicazione remota WSMAN.
Rimuovere -ComputerName dai *-Service cmdlet
Per incoraggiare l'uso costante del PSRP, il -ComputerName parametro è stato rimosso dai *-Service cmdlet. Usare Invoke-Command invece per eseguire i cmdlet nei computer remoti.
Correzione Get-Content -Delimiter per non includere il delimitatore nelle righe restituite
In precedenza, l'output durante l'uso Get-Content -Delimiter era incoerente e scomodo poiché richiedeva un ulteriore elaboramento dei dati per rimuovere il delimitatore. Questa modifica rimuove il delimitatore nelle righe restituite.
Modifiche apportate a Format-Hex
Il -Raw parametro non esegue ora alcuna operazione. Il Format-Hex cmdlet visualizza una rappresentazione vera dei numeri che include tutti i byte per il relativo tipo. Questo è ciò che il -Raw parametro ha fatto prima di questa modifica.
Correzione di errori di ortografia nel Get-ComputerInfo nome della proprietà
BiosSerialNumber è stato scritto male come BiosSeralNumber ed è stato cambiato con la grafia corretta.
Modifiche agli algoritmi hash disponibili
Gli algoritmi hash seguenti sono stati rimossi da .NET:
MACTripleDESRIPEMD160
Questa modifica influisce sul Get-FileHash cmdlet.
Aggiungere la convalida nei Get-* cmdlet in cui il passaggio di $null restituisce tutti gli oggetti anziché l'errore
Passare $null a uno dei seguenti ora genera un errore:
Get-Credential -UserNameGet-Event -SourceIdentifierGet-EventSubscriber -SourceIdentifierGet-Help -NameGet-PSBreakpoint -ScriptGet-PSProvider -PSProviderGet-PSSessionConfiguration -NameGet-Runspace -NameGet-RunspaceDebug -RunspaceNameGet-Service -NameGet-TraceSource -NameGet-Variable -Name
Aggiunta del supporto per il formato di file di log esteso W3C in Import-Csv
In precedenza, il Import-Csv cmdlet non può essere usato per importare direttamente i file di log in formato di log esteso W3C e sarebbe necessaria un'azione aggiuntiva. Con questa modifica, è supportato il formato di log esteso W3C.
Import-Csv
pstypenames si applica all'importazione quando le informazioni sul tipo sono presenti nel file CSV
In precedenza, gli oggetti esportati usando Export-Csv con TypeInformation importati con ConvertFrom-Csv non conservavano le informazioni sul tipo. Questa modifica aggiunge le informazioni di tipo al pstypenames membro se disponibili dal file CSV.
-NoTypeInformation è l'impostazione predefinita su Export-Csv
In precedenza, il Export-Csv cmdlet restituisce un commento come prima riga contenente il nome del tipo dell'oggetto. La modifica esclude le informazioni sul tipo per impostazione predefinita perché non viene riconosciuta dalla maggior parte degli strumenti CSV. Questa modifica è stata apportata per rispondere ai commenti e suggerimenti dei clienti.
Usalo -IncludeTypeInformation per mantenere il comportamento precedente.
Consentire l'uso di * nel percorso del Registro di sistema per Remove-Item
In precedenza, -LiteralPath dato che un wildcard lo trattava allo stesso modo e -Path se il jolly non trovava file, usciva silenziosamente. Il comportamento corretto dovrebbe essere letterale -LiteralPath , quindi se il file non esiste, dovrebbe dare un errore. Il cambiamento consiste nel trattare le carte jolly usate -Literal come letterale.
Group-Object ora ordina i gruppi
Come parte del miglioramento delle prestazioni, Group-Object ora restituisce un elenco ordinato dei gruppi.
Anche se non dovresti fare affidamento sull'ordine, potresti essere influenzato negativamente da questa modifica se desideravi il primo gruppo. È stato deciso che questo miglioramento delle prestazioni valeva la pena modificare poiché l'impatto di dipendere dal comportamento precedente è basso.
Deviazione standard in Measure-Object
L'output da Measure-Object ora include la proprietà StandardDeviation.
Get-Process | Measure-Object -Property CPU -AllStats
Count : 308
Average : 31.3720576298701
Sum : 9662.59375
Maximum : 4416.046875
Minimum :
StandardDeviation : 264.389544720926
Property : CPU
Get-PfxCertificate -Password
Get-PfxCertificate ora ha il Password parametro , che accetta un oggetto SecureString. In questo modo è possibile usarlo in modo non interattivo:
$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '
$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint
Rimozione della more funzione
In passato, PowerShell rilasciava una funzione su Windows chiamata more that wrapped more.com. La funzione è stata rimossa.
Inoltre, la help funzione è stata modificata per essere usata more.com su Windows, o il cercapersone predefinito del sistema specificato su $Env:PAGER piattaforme non Windows.
cd DriveName: ora gli utenti riportano alla directory di lavoro corrente in quell'unità
In precedenza, l'uso Set-Location di o cd per tornare a un PSDrive mandava gli utenti alla posizione predefinita di quel disco. Gli utenti vengono ora inviati all'ultima directory di lavoro corrente nota per la sessione.
cd - ritorni alla directory precedente
C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>
Oppure in Linux:
PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>
Inoltre, cd e cd -- cambia in $HOME.
Update-Help come non amministratore
Per richiesta popolare, Update-Help non è più necessario essere gestito come amministratore.
Update-Help Ora di default salva l'aiuto in una cartella con scopo utente.
Where-Object -Not
Con l'aggiunta del -Not parametro a Where-Object, può filtrare un oggetto nella pipeline per l'assenza di una proprietà o un valore di proprietà null/vuoto.
Ad esempio, questo comando restituisce tutti i servizi che non dispongono di servizi dipendenti definiti:
Get-Service | Where-Object -Not DependentServices
Modifiche ai cmdlet Web
L'API .NET sottostante dei Web Cmdlet è stata cambiata in System.Net.Http.HttpClient. Questa modifica offre molti vantaggi. Tuttavia, questo cambiamento insieme alla mancanza di interoperabilità con Internet Explorer ha portato a diversi cambiamenti di rompimento all'interno Invoke-WebRequest di e Invoke-RestMethod.
-
Invoke-WebRequestora supporta solo l'analisi sintetica di base in HTML.Invoke-WebRequestrestituisce sempre unBasicHtmlWebResponseObjectoggetto. LeParsedHtmlproprietà eFormssono state rimossi. -
BasicHtmlWebResponseObject.Headersi valori oraString[]sono invece diString. -
BasicHtmlWebResponseObject.BaseResponseora è unSystem.Net.Http.HttpResponseMessageoggetto. - La
Responseproprietà sulle eccezioni Web Cmdlet ora è unSystem.Net.Http.HttpResponseMessageoggetto. - La parsing rigorosa dell'intestazione RFC è ora predefinita per il
-Headersparametro e.-UserAgentQuesto può essere bypassato con-SkipHeaderValidation. -
file://eftp://gli schemi URI non sono più supportati. -
System.Net.ServicePointManagerLe impostazioni non sono più rispettate. - Attualmente non è disponibile alcuna autenticazione basata su certificati in macOS.
- L'uso di
-Credentialsopra unhttp://URI comporterà un errore. Usa unhttps://URI o fornisce il-AllowUnencryptedAuthenticationparametro per sopprimere l'errore. -
-MaximumRedirectionora produce un errore di terminazione quando i tentativi di reindirizzamento superano il limite fornito invece di restituire i risultati dell'ultimo reindirizzamento. - In PowerShell 6.2 è stata apportata una modifica per impostazione predefinita alla codifica UTF-8 per le risposte JSON. Quando non viene fornito un set di caratteri per una risposta JSON, la codifica predefinita deve essere UTF-8 per RFC 8259.
- Codifica predefinita impostata su UTF-8 per le risposte
application-json - Aggiunto parametro
-SkipHeaderValidationper consentireContent-Typeintestazioni non conformi agli standard - Aggiunto il parametro
-Formper fornire supporto semplificato amultipart/form-data. - Gestione conforme senza distinzione tra maiuscole e minuscole delle chiavi di relazione
- Aggiunta del parametro
-Resumeper i cmdlet web
Invoke-RestMethod restituisce informazioni utili quando non vengono restituiti dati
Quando un'API restituisce solo null, Invoke-RestMethod serializzava questa stringa come stringa "null" anziché $null. Questa modifica fissa la logica in Invoke-RestMethod per serializzare correttamente un letterale JSON null valido a valore singolo come $null.
I cmdlet Web avvisano quando -Credential vengono inviati su connessioni non crittografate
Quando si usa HTTP, il contenuto incluso le password viene inviato come testo non crittografato. Questa modifica non consente questa impostazione per impostazione predefinita e restituisce un errore se le credenziali vengono passate in modo non sicuro. Gli utenti possono bypassare questo sistema utilizzando lo -AllowUnencryptedAuthentication switch.
Rendere il parametro -OutFile nei cmdlet web per funzionare come -LiteralPath
A partire da PowerShell 7.1, il parametro OutFile dei cmdlet Web funziona come LiteralPath e non elabora caratteri jolly.
Modifiche api
Rimuovi AddTypeCommandBase classe
La AddTypeCommandBase classe fu rimossa Add-Type per migliorare le prestazioni. Questa classe viene usata solo dal Add-Type cmdlet e non deve influire sugli utenti.
Rimossa VisualBasic come lingua supportata in Add-Type
In passato, si poteva compilare codice in Visual Basic usando il Add-Type cmdlet. Visual Basic veniva raramente utilizzato con Add-Type. Questa funzionalità è stata rimossa per ridurre le dimensioni di PowerShell.
Rimosso il supporto RunspaceConfiguration
In precedenza, quando si crea uno spazio di esecuzione di PowerShell a livello di codice usando l'API, è possibile usare le classi legacy RunspaceConfiguration o più recenti InitialSessionState . Questa modifica ha rimosso il supporto per RunspaceConfiguration e supporta InitialSessionStatesolo .
CommandInvocationIntrinsics.InvokeScript associare gli argomenti a $input invece di $args
Una posizione errata di un parametro ha restituito gli argomenti passati come input anziché come argomenti.
Rimuovere ClrVersion e BuildVersion proprietà da $PSVersionTable
La ClrVersion proprietà di $PSVersionTable non è utile con CoreCLR. Gli utenti finali non devono usare tale valore per determinare la compatibilità.
La BuildVersion proprietà è stata associata alla versione di compilazione di Windows, che non è disponibile nelle piattaforme non Windows. Usare la GitCommitId proprietà per recuperare la versione di compilazione esatta di PowerShell.
Implementare l'analisi di escape Unicode
`u#### oppure `u{####} viene convertito nel corrispondente carattere Unicode. Per produrre un letterale `u, sfuggi dal backtick: ``u.
Problema di associazione dei parametri con ValueFromRemainingArguments nelle funzioni PS
ValueFromRemainingArguments ora restituisce i valori come un array invece che un singolo valore che a sua volta è un array.
Usi ripuliti di CommandTypes.Workflow e WorkflowInfoCleaned
Pulire il codice correlato agli usi di CommandTypes.Workflow e WorkflowInfo in System.Management.Automation.
Queste lievi modifiche importanti influiscono principalmente sul codice del provider di aiuto.
- Modificare i costruttori pubblici di
WorkflowInfoin interni. Non è più supportato il flusso di lavoro, quindi è opportuno non consentire agli utenti di creareWorkflowistanze. - Rimuovere il tipo System.Management.Automation.DebugSource perché viene usato solo per il debug del flusso di lavoro.
- Rimuovere l'overload di
SetParentdalla classe astratta Debugger usato solo per il debug del flusso di lavoro. - Rimuovere lo stesso overload di
SetParentdalla classe derivata RemotingJobDebugger.
Non incapsulare il risultato restituito in PSObject quando si converte un ScriptBlock in un delegato
Quando a ScriptBlock viene convertito in un tipo delegato da usare nel contesto C#, avvolgere il risultato in a PSObject porta a problemi inutili:
- Quando il valore viene convertito nel tipo di ritorno delegato, il
PSObjectviene essenzialmente srotolato. Quindi nonPSObjectè necessario. - Quando il tipo di ritorno delegato è
object, viene avvolto in unPSObject, rendendo difficile lavorarci in codice C#.
Dopo questo cambiamento, l'oggetto restituito diventa l'oggetto sottostante.
Supporto remoto
La comunicazione remota di PowerShell (PSRP) con WinRM non è supportata per le piattaforme non Windows. È possibile usare PowerShell Remoting (PSRP) tramite WinRM da Windows per connettersi ad altri computer Windows. PowerShell supporta anche la comunicazione remota su SSH in tutte le piattaforme (Windows, macOS e Linux). Per altre informazioni, vedere Comunicazione remota SSH in PowerShell.
PowerShell Direct per contenitori tenta di usare pwsh prima
PowerShell Direct è una funzionalità di PowerShell e Hyper-V che permette di connettersi a una VM o a un container Hyper-V senza connettività di rete o altri servizi di gestione remota.
In passato, PowerShell Direct è connesso usando l'istanza predefinita di Windows PowerShell nel contenitore. Ora, PowerShell Direct tenta prima di connettersi usando qualsiasi variabile disponibile pwsh.exe sull'ambiente PATH . Se pwsh.exe non è disponibile, PowerShell Direct torna a usare powershell.exe.
Enable-PSRemoting ora crea endpoint remoting separati per le versioni di anteprima
Enable-PSRemoting Ora crea due configurazioni di sessione remoto:
- Uno per la versione principale di PowerShell. Ad esempio:
PowerShell.6. Questo endpoint che può essere basato su aggiornamenti di versione secondaria come configurazione della sessione di PowerShell 6 "a livello di sistema" - Una configurazione di sessione specifica per versione, ad esempio:
PowerShell.6.1.0
Questo comportamento è utile se si vogliono installare più versioni di PowerShell 6 e accessibili nello stesso computer.
Inoltre, le versioni preview di PowerShell ora ottengono le proprie configurazioni di sessione remota dopo aver eseguito il Enable-PSRemoting cmdlet:
C:\WINDOWS\system32> Enable-PSRemoting
L'output potrebbe essere diverso se non è stato configurato WinRM in precedenza.
WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.
È quindi possibile visualizzare configurazioni di sessione di PowerShell separate per l'anteprima e le build stabili di PowerShell 6 e per ogni versione specifica.
Get-PSSessionConfiguration
Name : PowerShell.6.2-preview.1
PSVersion : 6.2
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : PowerShell.6-preview
PSVersion : 6.2
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : powershell.6
PSVersion : 6.1
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
Name : powershell.6.1.0
PSVersion : 6.1
StartupScript :
RunAsUser :
Permission : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
user@host:port sintassi supportata per SSH
I client SSH tipicamente supportano una stringa di connessione nel formato user@host:port. Con l'aggiunta di SSH come protocollo per la comunicazione remota di PowerShell, è stato aggiunto il supporto per questo formato di stringa di connessione:
Enter-PSSession -HostName fooUser@ssh.contoso.com:2222
I dati di telemetria possono essere disabilitati solo con una variabile di ambiente
PowerShell invia dati di telemetria di base a Microsoft al momento dell'avvio. I dati includono il nome del sistema operativo, la versione del sistema operativo e la versione di PowerShell. Questi dati consentono di comprendere meglio gli ambienti in cui viene usato PowerShell e di assegnare priorità alle nuove funzionalità e alle correzioni.
Per rifiutare esplicitamente questa telemetria, impostare la variabile di ambiente POWERSHELL_TELEMETRY_OPTOUT su true, yeso 1. Non supportiamo più la cancellazione del file DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY per disabilitare la telemetria.