Partilhar via


O que há de novo no PowerShell 7.5

O PowerShell 7.5.4 inclui os seguintes recursos, atualizações e alterações de quebra. O PowerShell 7.5.4 foi criado na versão .NET 9.0.306.

Para obter uma lista completa das alterações, consulte o CHANGELOG no repositório GitHub. Para obter mais informações sobre o .NET 9, consulte O que há de novo no .NET 9.

Alterações Disruptivas

  • Correção -OlderThan e parâmetros para -NewerThan quando usar Test-Path e intervalo de datas (PathType) (Obrigado@ArmaanMcleod!)
    • Anteriormente -OlderThan seria ignorado se especificado em conjunto
  • Alterar New-FileCatalog -CatalogVersion padrão para 2 (#20428) (Obrigado @ThomasNieto!)
  • Bloquear a obtenção de ajuda de locais de rede em sessões de comunicação remota restritas (#20593)
  • O instalador do Windows agora lembra as opções de instalação usadas e as usa para inicializar as opções para a próxima instalação (#20420) (Obrigado @reduckted!)
  • ConvertTo-Json agora serializa BigInteger como um número (#21000) (Obrigado @jborean93!)

Módulos atualizados

O PowerShell 7.5.4 inclui os seguintes módulos atualizados:

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

Melhorias na completação automática

Muito obrigado a @ArmaanMcleod e outros por todo o seu trabalho para melhorar o preenchimento de guias.

  • Volte à inferência de tipo quando o valor-chave hashtable não puder ser recuperado da expressão segura (#21184) (Obrigado @MartinGC94!)
  • Corrigir a regressão ao fazer inferência de tipo para $_ (#21223) (Obrigado @MartinGC94!)
  • Expanda ~ para $HOME no Windows com conclusão de tabulação (#21529)
  • Não conclua ao declarar o nome do parâmetro e o membro da classe (#21182) (Obrigado @MartinGC94!)
  • Impedir fallback para conclusão automática de arquivos quando pressionar 'tab' ao completar nomes de tipo (#20084) (Obrigado @MartinGC94)
  • Adicionar argumento completer a -Version para Set-StrictMode (#20554) (Obrigado @ArmaanMcleod!)
  • Adicionar preenchedor de argumentos para -VerbGet-Verb/ e refatorar Get-Command (Get-Verb) (Obrigado
  • Adicionar completer de argumento para -Verb (Start-Process) (Obrigado )
  • Adicionar argumento completer para os comandos , & (#20451) (Obrigado
  • Adicionar -Module conclusão para os comandos Save-Help/Update-Help (#20678) (Obrigado @ArmaanMcleod))

Novos cmdlets

  • Adicionar ConvertTo-CliXml e ConvertFrom-CliXml cmdlets (#21063) (Obrigado @ArmaanMcleod!)

Melhorias nos cmdlets Web

  • Correção para permitir -PassThru e -Outfile trabalhar em conjunto (#24086)
  • Adicionar OutFile propriedade em WebResponseObject (#24047)
  • Mostrar nome do arquivo em Invoke-WebRequest -OutFile -Verbose (#24041)
  • Corrige os WebCmdlets quando -Body é especificado, mas ContentType não (#23952) (Obrigado @CarloToso!)
  • Correção Invoke-WebRequest para relatar o tamanho correto quando -Resume está especificado (#20207) (Obrigado @LNKLEO!)
  • Corrigir cmdlets da Web para permitir que os WinForm aplicativos funcionem corretamente (#20606)

Outras melhorias no cmdlet

  • Corrigir Out-GridView substituindo o uso de obsoletos BinaryFormatter por implementação personalizada (#25559)
  • Habilitar -NoRestart para trabalhar com Register-PSSessionConfiguration (#23891)
  • Adicionar IgnoreComments e AllowTrailingCommas opções ao Test-Json cmdlet (#23817) (Obrigado @ArmaanMcleod!)
  • Get-Help pode relatar parâmetros com atributo ValueFromRemainingArguments como adequados para integrar em pipeline (#23871)
  • Alterar o tipo de LineNumber para ulong in Select-String (#24075) (Obrigado @Snowman-25!)
  • Get-Process: Remover requisito de administrador para -IncludeUserName (#21302) (Obrigado @jborean93!)
  • Correção Test-Path -IsValid para verificar os caracteres de caminho e nome de arquivo inválidos (#21358)
  • Adicionar RecommendedAction ao ConciseView relatório de erros (#20826) (Obrigado @JustinGrote!)
  • Adicionada barra de progresso para Remove-Item cmdlet (#20778) (Obrigado @ArmaanMcleod!)
  • Corrigir Test-Connection devido a alterações do .NET 8 (#20369)
  • Corrigir Get-Service mensagem de erro não terminativa para incluir categoria (#20276)
  • Adicionar -Empty e -InputObject parâmetros para New-Guid (#20014) (Obrigado @CarloToso!)
  • Adicione o alias r ao parâmetro -Recurse para o Get-ChildItem comando (#20100) (Obrigado @kilasuit!)
  • Adicionar LP aos aliases das LiteralPath funções que ainda não o têm (#20820)
  • Adicionar retorno de localização implícita a Import-LocalizedData (#19896) (Obrigado @chrisdent-de!)
  • Adicionar Aliases às propriedades mostradas ao formatar o conteúdo da ajuda do parâmetro retornado por Get-Help (#20994)
  • Adicionar HelpUri a Remove-Service (#20476)
  • Corrigir erro de conclusão para o provedor SCCM (#20815, #20919, #20915) (Obrigado @MartinGC94!)
  • Corrigir regressão em Get-Content quando -Tail 0 e -Wait são usados juntos (#20734) (Obrigado @CarloToso!)
  • Correção Start-Process -PassThru para garantir que a ExitCode propriedade esteja acessível para o objeto retornado Process (#20749) (Obrigado @CodeCyclone!)
  • Resolva Group-Object para usar a cultura atual na sua saída (#20608)
  • Corrigir Group-Object saída usando strings interpoladas (#20745) (Obrigado a @mawosoft!))
  • Corrigir renderização de DisplayRoot para rede PSDrive (#20793)
  • Corrija Copy-Item o progresso para mostrar concluído apenas quando todos os arquivos forem copiados (#20517)
  • Corrigir regressão de conclusão de caminho UNC (#20419) (Obrigado @MartinGC94!)
  • Relatar erro se um -ExecutionPolicy inválido for passado para pwsh (#20460)
  • Adicione os módulos WinGetCommandNotFound e CompletionPredictor para controlar o uso (#21040)
  • Adicionar parâmetro DateKind a ConvertFrom-Json (#20925) (Obrigado @jborean93!)
  • Adicionar DirectoryInfo ao TipoDeSaída para New-Item (#21126) (Obrigado @MartinGC94!)
  • Corrigir Get-Error a serialização de valores de matriz (#21085) (Obrigado @jborean93!)
  • Correção Test-ModuleManifest para que ele possa usar um caminho UNC (#24115)
  • Correção Get-TypeData para gravar no pipeline imediatamente em vez de coletar dados primeiro (#24236) (Obrigado @MartinGC94)
  • Adicionar o parâmetro -Force aos cmdlets Resolve-Path e Convert-Path para suportar ficheiros ocultos com caracteres curinga #20981 (Obrigado @ArmaanMcleod!)
  • Definir manipuladores padrão explicitamente ao iniciar um processo com -NoNewWindow (#25324)
  • Torne os membros herdados da instância interna protegida acessíveis no escopo da classe. (#25547) (Obrigado @mawosoft!)
  • Remova a sugestão difusa antiga e corrija a sugestão de nome de arquivo de script local (#25330)
  • Método Fix PSMethodInvocationConstraints.GetHashCode (#25306) (Obrigado @crazyjncsu!)

Melhorias no motor

  • Mover o registo de invocação do método .NET para após a conversão de tipo necessária ser feita nos argumentos do método (#25357)
  • Fallback para AppLocker após WldpCanExecuteFile (#25305)
  • Explicitamente iniciar e parar ANSI Error Color (#24065) (Obrigado @JustinGrote!)
  • Melhorar a definição de sobrecarga .NET de métodos genéricos (#21326) (Obrigado @jborean93!))
  • Otimizar a += operação para uma coleção quando é uma matriz de objetos (#23901) (Obrigado @jborean93!)
  • Adicionar telemetria para verificar tags específicas ao importar um módulo (#20371)
  • Adicionar PSAdapter e ConsoleGuiTools à lista de autorização da telemetria de carregamento do módulo (#20641)
  • Adicionar módulo WinGet para controlar o uso (#21040)
  • Verifique se o nome do arquivo não é nulo ao registrar eventos WDAC ETW (#20910) (Obrigado @jborean93!)
  • Corrigir quatro regressões introduzidas pelo recurso de log WDAC (#20913)
  • Deixe os manipuladores de entrada, saída e erro indefinidos quando não estiverem redirecionados (#20853)
  • Corrigir cmdlets de proxy de comunicação remota implícita para agir em parâmetros comuns (#20367)
  • Incluir a versão do módulo em mensagens de erro quando o módulo não for encontrado (#20144) (Obrigado @ArmaanMcleod!)
  • Corrigir unixmode para lidar com setuid e sticky quando o ficheiro não é um executável (#20366)
  • Corrigir a utilização de assembly para empregar Path.Combine ao construir caminhos de assembly (#21169)
  • Validar o valor para usar namespace durante verificações semânticas para evitar a declaração de namespaces inválidos (#21162)
  • Gerir a ferramenta global especialmente quando estiver a adicionar $PSHOME ao PATH (#24228)

Funcionalidades experimentais

Os seguintes recursos experimentais foram convertidos em recursos principais no PowerShell 7.5-rc.1:

Os seguintes recursos experimentais estão incluídos no PowerShell 7.5-rc.1:

Melhorias de desempenho

O PowerShell 7.5-rc.1 incluiu PR#23901 do @jborean93 que melhora o desempenho da operação de += para uma matriz de objetos.

O exemplo a seguir mede o desempenho de diferentes métodos de adição de elementos a uma matriz.

$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 você executa o script no PowerShell 7.4.6, você vê que usar o operador += é o método mais 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 você executa o script no PowerShell 7.5-rc.1, você vê que usar o operador += é muito mais rápido do que o PowerShell 7.4.6. Agora, também é mais rápido do que usar o método 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