Condividi tramite


Novità di PowerShell 7.5

PowerShell 7.5.4 include le funzionalità, gli aggiornamenti e le modifiche di rilievo seguenti. PowerShell 7.5.4 è basato sulla versione .NET 9.0.306.

Per un elenco completo delle modifiche, vedere CHANGELOG nel repository GitHub. Per altre informazioni su .NET 9, vedere Novità di .NET 9.

Modifiche di rilievo

  • Correzione dei parametri -OlderThan e -NewerThan per Test-Path quando si utilizza PathType e l'intervallo di date (#20942) (grazie @ArmaanMcleod!))
    • In precedenza -OlderThan verrebbe ignorato se specificato insieme
  • Impostare New-FileCatalog -CatalogVersion il valore predefinito su 2 (#20428) (grazie) @ThomasNieto!)
  • Bloccare l'assistenza dai percorsi di rete nelle sessioni remote con restrizioni (#20593)
  • Windows Installer ora memorizza le opzioni di installazione usate e le usa per inizializzare le opzioni per l'installazione successiva (#20420) (grazie) @reduckted!)
  • ConvertTo-Json ora serializza BigInteger come numero (#21000) (grazie) @jborean93!)

Moduli aggiornati

PowerShell 7.5.4 include i moduli aggiornati seguenti:

  • Microsoft.PowerShell.PSResourceGet v1.1.1
  • PSReadLine v2.3.6

Miglioramenti del completamento della tabulazione

Molte grazie a @ArmaanMcleod e ad altri per il loro grande lavoro per migliorare il completamento delle schede.

  • Utilizzare l'inferenza del tipo quando non è possibile recuperare la chiave e il valore della tabella hash da un'espressione sicura (#21184) (grazie.) @MartinGC94!)
  • Correzione della regressione durante l'inferenza del tipo per $_ (#21223) (grazie) @MartinGC94!)
  • Espandi ~ fino a $HOME in Windows con il completamento della scheda (#21529)
  • Non completare la dichiarazione del nome del parametro e del membro della classe (#21182) (grazie) @MartinGC94!)
  • Impedire il fallback al completamento del file quando si utilizzano i tab per completare i nomi dei tipi (#20084) (grazie)
  • Aggiungere il compilatore di argomenti a -Version per Set-StrictMode (#20554) (grazie) @ArmaanMcleod!)
  • Aggiungi il completatore di argomenti per -VerbGet-Verb/ e il refactoring di Get-Command (Get-Verb) (Grazie )
  • Aggiungi il completatore di argomenti per -Verb (Start-Process) Grazie a
  • Aggiungere il completatore di argomenti per i comandi -Scope, *-Variable & *-Alias (*-PSDrive) (Grazie )
  • Aggiunta -Module del completamento per Save-Help/Update-Help i comandi (#20678) (grazie @ArmaanMcleod))

I nuovi cmdlet

  • Aggiungi i cmdlet ConvertTo-CliXml e ConvertFrom-CliXml (#21063) (grazie @ArmaanMcleod!))

Miglioramenti ai cmdlet Web

  • Correzione per consentire -PassThru e -Outfile collaborare (#24086)
  • Aggiungere la proprietà OutFile in WebResponseObject (#24047)
  • Mostra nome file in Invoke-WebRequest -OutFile -Verbose (#24041)
  • Correzione di WebCmdlets quando -Body viene specificato ma ContentType non (#23952) (grazie) @CarloToso!)
  • Correggi Invoke-WebRequest per segnalare dimensioni corrette quando -Resume è specificato (#20207) (grazie @LNKLEO!))
  • Correzione dei cmdlet Web per consentire WinForm il corretto funzionamento delle app (#20606)

Altri miglioramenti ai cmdlet

  • Correzione Out-GridView sostituendo l'uso di obsoleto BinaryFormatter con l'implementazione personalizzata (#25559)
  • Abilitare -NoRestart a funzionare con Register-PSSessionConfiguration (#23891)
  • Aggiungere opzioni IgnoreComments e AllowTrailingCommas al Test-Json cmdlet (#23817) (grazie @ArmaanMcleod!))
  • Get-Help può segnalare parametri con attributo ValueFromRemainingArguments come pipeline-abile (#23871)
  • Modificare il tipo di LineNumber in ulong in Select-String (#24075) (grazie) @Snowman-25!)
  • Get-Process: Rimuovere il requisito di amministratore per -IncludeUserName (#21302) (grazie) @jborean93!)
  • Correzione Test-Path -IsValid per verificare la presenza di caratteri di percorso e nome file non validi (#21358)
  • Aggiungere RecommendedAction alla ConciseView segnalazione errori (#20826) (grazie) @JustinGrote!)
  • Aggiunta barra di avanzamento per Remove-Item cmdlet (#20778) (grazie @ArmaanMcleod!))
  • Correzione Test-Connection dovuta a modifiche di .NET 8 (#20369)
  • Correggi il messaggio di errore non terminante Get-Service per includere la categoria (#20276)
  • Aggiungere i parametri -Empty e -InputObject a New-Guid (#20014) (Grazie @CarloToso!))
  • Aggiungere l'alias r al parametro -Recurse per il Get-ChildItem comando (#20100) (grazie) @kilasuit!)
  • Aggiungere LP agli LiteralPath alias per le funzioni che lo richiedono ancora (#20820)
  • Aggiungere il fallback di localizzazione implicita a Import-LocalizedData (#19896) (grazie) @chrisdent-de!)
  • Aggiungi Aliases alle proprietà visualizzate durante la formattazione del contenuto della Guida relativa al parametro restituito da Get-Help (#20994)
  • Aggiungi HelpUri a Remove-Service (#20476)
  • Correzione dell'arresto anomalo del completamento per il provider SCCM (#20815, #20919, #20915) (grazie) @MartinGC94!)
  • Correzione della regressione in Get-Content quando -Tail 0 e -Wait vengono usati insieme (#20734) (grazie) @CarloToso!)
  • Correzione Start-Process -PassThru per assicurarsi che la ExitCode proprietà sia accessibile per l'oggetto restituito Process (#20749) (grazie) @CodeCyclone!)
  • Correggi Group-Object per utilizzare la cultura corrente nel suo output (#20608)
  • Correzione Group-Object dell'output usando stringhe interpolate (#20745) (grazie) @mawosoft!)
  • Correzione del rendering di DisplayRoot per la rete PSDrive (#20793)
  • Correzione Copy-Item dello stato di avanzamento per visualizzare il completamento solo quando tutti i file vengono copiati (#20517)
  • Correzione della regressione del completamento del percorso UNC (#20419) (grazie) @MartinGC94!)
  • Segnala l'errore se un -ExecutionPolicy non valido viene passato a pwsh (#20460)
  • Aggiungere moduli WinGetCommandNotFound e CompletionPredictor per tenere traccia dell'utilizzo (#21040)
  • Aggiungere il parametro DateKind a ConvertFrom-Json (#20925) (grazie) @jborean93!)
  • Aggiungere DirectoryInfo all'OutputType per New-Item (#21126) (grazie @MartinGC94!))
  • Correzione Get-Error della serializzazione dei valori di matrice (#21085) (grazie) @jborean93!)
  • Correzione Test-ModuleManifest in modo che possa usare un percorso UNC (#24115)
  • Correggi Get-TypeData per scrivere nella pipeline subito invece di raccogliere prima i dati (#24236) (Grazie @MartinGC94))
  • Aggiungere il parametro -Force ai cmdlet Resolve-Path e Convert-Path per supportare i file nascosti con caratteri jolly #20981 (grazie @ArmaanMcleod!))
  • Impostare gli handle standard in modo esplicito all'avvio di un processo con -NoNewWindow (#25324)
  • Rendere accessibili i membri di istanza protetti e interni ereditati nell'ambito della classe. (#25547) (Grazie) @mawosoft!)
  • Rimuovere il suggerimento fuzzy precedente e correggere il suggerimento relativo al nome file dello script locale (#25330)
  • Correggi metodo PSMethodInvocationConstraints.GetHashCode (#25306) (Grazie @crazyjncsu!))

Miglioramenti del motore

  • Spostare la registrazione delle invocazioni del metodo .NET dopo che è stata eseguita la conversione del tipo necessaria per gli argomenti del metodo (#25357)
  • Fallback a AppLocker dopo WldpCanExecuteFile (#25305)
  • Avviare e arrestare in modo esplicito il colore errore ANSI (#24065) (grazie) @JustinGrote!)
  • Migliorare la definizione di overload dei metodi generici in .NET (#21326) grazie!
  • Ottimizzare l'operazione += per una raccolta quando si tratta di una matrice di oggetti (#23901) (grazie) @jborean93!)
  • Aggiungere i dati di telemetria per verificare la presenza di tag specifici durante l'importazione di un modulo (#20371)
  • Aggiungere PSAdapter e ConsoleGuiTools all'elenco di elementi di telemetria del modulo di caricamento (#20641)
  • Aggiungere un modulo WinGet per tenere traccia dell'utilizzo (#21040)
  • Assicurarsi che il nome file non sia Null durante la registrazione degli eventi ETW WDAC (#20910) (grazie) @jborean93!)
  • Correzione di quattro regressioni introdotte dalla funzionalità di registrazione WDAC (#20913)
  • Lasciare l'input, l'output e gli handle di errore non impostati quando non vengono reindirizzati (#20853)
  • Correzione dei cmdlet proxy di comunicazione remota implicita per agire sui parametri comuni (#20367)
  • Includere la versione del modulo nei messaggi di errore quando il modulo non viene trovato (#20144) (grazie) @ArmaanMcleod!)
  • Correzione unixmode per gestire setuid e sticky quando il file non è un eseguibile (#20366)
  • Correzione dell'uso dell'assembly per l'uso di Path.Combine durante la creazione di percorsi di assembly (#21169)
  • Convalidare il valore dell'uso del namespace durante i controlli semantici per impedire la dichiarazione di namespace non validi (#21162)
  • Gestire lo strumento globale in modo speciale quando si aggiunge $PSHOME all'inizio di PATH (#24228)

Funzionalità sperimentali

Le funzionalità sperimentali seguenti sono state convertite in funzionalità mainstream in PowerShell 7.5-rc.1:

Le funzionalità sperimentali seguenti sono incluse in PowerShell 7.5-rc.1:

Miglioramenti delle prestazioni

PowerShell 7.5-rc.1 include pr#23901 da @jborean93 che migliora le prestazioni dell'operazione += per una matrice di oggetti.

Nell'esempio seguente vengono misurate le prestazioni per metodi diversi di aggiunta di elementi a una matrice.

$tests = @{
    'Direct Assignment' = {
        param($count)

    $result = foreach($i in 1..$count) {
            $i
        }
    }
    'List<T>.Add(T)' = {
        param($count)

        $result = [Collections.Generic.List[int]]::new()
        foreach($i in 1..$count) {
            $result.Add($i)
        }
    }
    'Array+= Operator' = {
        param($count)

        $result = @()
        foreach($i in 1..$count) {
            $result += $i
        }
    }
}

5kb, 10kb | ForEach-Object {
    $groupResult = foreach($test in $tests.GetEnumerator()) {
        $ms = (Measure-Command { & $test.Value -Count $_ }).TotalMilliseconds

        [pscustomobject]@{
            CollectionSize    = $_
            Test              = $test.Key
            TotalMilliseconds = [Math]::Round($ms, 2)
        }

        [GC]::Collect()
            [GC]::WaitForPendingFinalizers()
    }

    $groupResult = $groupResult | Sort-Object TotalMilliseconds
        $groupResult | Select-Object *, @{
            Name       = 'RelativeSpeed'
            Expression = {
                $relativeSpeed = $_.TotalMilliseconds / $groupResult[0].TotalMilliseconds
                $speed = [Math]::Round($relativeSpeed, 2).ToString() + 'x'
                if ($speed -eq '1x') { $speed } else { $speed + ' slower' }
            }
        } | Format-Table -AutoSize
}

Quando si esegue lo script in PowerShell 7.4.6, si noterà che l'uso dell'operatore += è il metodo più lento.

CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
          5120 Direct Assignment                4.17 1x
          5120 List<T>.Add(T)                  90.79 21.77x slower
          5120 Array+= Operator               342.58 82.15x slower


CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
         10240 Direct Assignment                0.64 1x
         10240 List<T>.Add(T)                 184.10 287.66x slower
         10240 Array+= Operator              1668.13 2606.45x slower

Quando si esegue lo script in PowerShell 7.5-rc.1, si noterà che l'uso dell'operatore += è molto più veloce di PowerShell 7.4.6. Ora, è anche più veloce rispetto all'uso del metodo List<T>.Add(T).

CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
          5120 Direct Assignment                4.71 1x
          5120 Array+= Operator                40.42 8.58x slower
          5120 List<T>.Add(T)                  92.17 19.57x slower


CollectionSize Test                TotalMilliseconds RelativeSpeed
-------------- ----                ----------------- -------------
         10240 Direct Assignment                1.76 1x
         10240 Array+= Operator               104.73 59.51x slower
         10240 List<T>.Add(T)                 173.00 98.3x slower