Compartilhar via


O que há de novo no PowerShell 7.5

O PowerShell 7.5-rc.1 inclui os seguintes recursos, atualizações e alterações interruptivas. PowerShell 7.5 é baseado no lançamento de disponibilidade geral do .NET 9.0.100.

Para ver uma lista completa das alterações, confira o LOG DE MUDANÇAS no repositório do GitHub.

Alterações de quebra

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

Módulos atualizados

O PowerShell 7.5-rc.1 inclui os seguintes módulos atualizados:

  • Microsoft.PowerShell.PSResourceGet v1.1.0-RC2
  • PSReadLine v2.3.6

Aprimoramentos de conclusão da guia

Muito obrigado a @ArmaanMcleod e a outras pessoas por todo o seu trabalho para aprimorar a conclusão das guias.

  • Voltar à inferência de tipo quando o valor-chave hashtable não puder ser recuperado da expressão segura (n° 21184) (Obrigado, @MartinGC94!)
  • Corrigir a regressão ao fazer a inferência de tipos para $_ (n° 21223) (Obrigado, @MartinGC94!)
  • Expandir ~ para $home no Windows com preenchimento de guia (n° 21529)
  • Não concluir ao declarar o nome do parâmetro e o membro da classe (n° 21182) (Obrigado, @MartinGC94!)
  • Impedir o fallback para a conclusão do arquivo quando o tabulador completar nomes de tipos (nº20084) (Obrigado @MartinGC94)
  • Adicionar complemento de argumento a -Version para Set-StrictMode (nº20554) (Obrigado @ArmaanMcleod!)
  • Adicionar o concluidor de argumentos -Verb para Get-Verb/ Get-Command e refatorar Get-Verb (nº20286) (Obrigado @ArmaanMcleod)
  • Adicionar o complemento do argumento -Verb para Start-Process (nº20415) (Obrigado @ArmaanMcleod)
  • Adicionar o complemento do argumento -Scope para comandos *-Variable, *-Alias e *-PSDrive (nº20451) (Obrigado @ArmaanMcleod)
  • Adicionar a conclusão -Module para Save-Help/Update-Help comandos (nº20678) (Obrigado @ArmaanMcleod)

Novos cmdlets

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

Melhorias nos cmdlets da Web

  • Correção para permitir que -PassThru e -Outfile funcionem juntos (#24086)
  • Adicionar OutFile propriedade em WebResponseObject (#24047)
  • Mostrar nome de arquivo em Invoke-WebRequest -OutFile -Verbose (#24041)
  • Corrigir WebCmdlets quando -Body é especificado, mas ContentType não é (# 23952) (Obrigado @CarloToso!)
  • Corrigir Invoke-WebRequest para informar o tamanho correto quando -Resume for especificado (nº20207) (Obrigado @LNKLEO!)
  • Corrigir os Cmdlets Web para permitir que os aplicativos WinForm funcionem corretamente (nº20606)

Aprimoramentos de outros cmdlet

  • Habilitar -NoRestart para trabalhar com Register-PSSessionConfiguration (#23891)
  • Adicionar as opções IgnoreComments e AllowTrailingCommas ao cmdlet Test-Json (#23817) (Obrigado @ArmaanMcleod!)
  • Get-Help pode relatar parâmetros com o atributo ValueFromRemainingArguments como passível de uso em pipeline (# 23871)
  • Alterar tipo de LineNumber para ulong em Select-String (# 24075) (Obrigado @Snowman-25!)
  • Get-Process: remover o requisito de administrador para -IncludeUserName (n° 21302) (Obrigado, @jborean93!)
  • Corrigir Test-Path -IsValid para verificar se há caracteres inválidos de caminho e nome de arquivo (n° 21358)
  • Adicionar RecommendedAction ao ConciseView do relatório de erros (n° 20826) (Obrigado, @JustinGrote!)
  • Adicionada barra de progresso para o cmdlet Remove-Item (n° 20778) (Obrigado, @ArmaanMcleod!)
  • Correção Test-Connection devido a alterações no .NET 8 (nº20369)
  • Corrigir a mensagem de erro Get-Service não finalizada para incluir a categoria (nº20276)
  • Adicione os parâmetros -Empty e -InputObject a New-Guid (nº20014) (Obrigado @CarloToso!)
  • Adicione o alias r ao parâmetro -Recurse do comando Get-ChildItem (nº20100) (Obrigado @kilasuit!)
  • Adicionar aliases LP a LiteralPath para funções ainda estão ausentes (nº20820)
  • Adicionar fallback de localização implícita para Import-LocalizedData (nº19896) (Obrigado @chrisdent-de!)
  • Adicione Aliases às propriedades exibidas ao formatar o conteúdo da ajuda do parâmetro retornado por Get-Help (nº20994)
  • Adicionar HelpUri a Remove-Service (nº20476)
  • Correção da falha de conclusão do provedor SCCM (nº20815, nº20919, nº20915) (Obrigado @MartinGC94!)
  • Corrigir a regressão em Get-Content quando -Tail 0 e -Wait são usados juntos (nº20734) (Obrigado @CarloToso!)
  • Corrija Start-Process -PassThru para garantir que a propriedade ExitCode esteja acessível para o objeto Process retornado (nº20749) (Obrigado @CodeCyclone!)
  • Corrigir Group-Object para usar a cultura atual em sua saída (nº20608)
  • Corrigir a saída Group-Object usando cadeia de caracteres interpoladas (nº20745) (Obrigado @mawosoft!)
  • Corrigir a renderização de DisplayRoot para a rede PSDrive (nº20793)
  • Corrigir o progresso de Copy-Item para que seja exibido como concluído somente quando todos os arquivos forem copiados (nº20517)
  • Corrigir a regressão do preenchimento do caminho UNC (nº20419) (Obrigado @MartinGC94!)
  • Reportar o erro se -ExecutionPolicy inválido for passado para pwsh (nº20460)
  • Adicione os módulos WinGetCommandNotFound e CompletionPredictor para rastrear o uso (#21040)
  • Adicione o parâmetro DateKind a ConvertFrom-Json (#20925) (Obrigado @jborean93!)
  • Adicione DirectoryInfo ao OutputType para New-Item (nº 21126) (Obrigado @MartinGC94!)
  • Corrigir serialização de Get-Error de valores de matriz (#21085) (Obrigado @jborean93!)
  • Corrigir Test-ModuleManifest para que ele possa usar um caminho UNC (# 24115)
  • Corrigir Get-TypeData para gravar no pipeline imediatamente em vez de coletar dados primeiro (# 24236) (Obrigado @MartinGC94)
  • Adicionar parâmetro -Force aos cmdlets Resolve-Path e Convert-Path para dar suporte a arquivos ocultos curinga #20981 (Obrigado @ArmaanMcleod!)

Aprimoramentos no mecanismo

  • Iniciar e parar explicitamente a cor de erro ANSI (# 24065) (Obrigado @JustinGrote!)
  • Melhorar a definição de sobrecarga do .NET de métodos genéricos (# 21326) (Obrigado @jborean93!)
  • Otimizar a operação += de uma coleção quando for uma matriz de objetos (# 23901) (Obrigado @jborean93!)
  • Adicionar telemetria para verificar se há tags específicas ao importar um módulo (nº20371)
  • Adicione PSAdapter e ConsoleGuiTools à lista de permissões de telemetria de carga do módulo (nº20641)
  • Adicionar o módulo Winget para rastrear o uso (nº21040)
  • Certifique-se de que o nome do arquivo não seja nulo ao registrar eventos do WDAC ETW (nº20910) (Obrigado @jborean93!)
  • Correção de quatro regressões introduzidas pelo recurso de registro do WDAC (nº20913)
  • Deixar os identificadores de entrada, saída e erro sem definição quando eles não forem redirecionados (nº20853)
  • Corrigir os cmdlets de proxy de comunicação remota implícita para atuar em parâmetros comuns (nº20367)
  • Incluir a versão do módulo em mensagens de erro quando o módulo não for encontrado (nº20144) (Obrigado @ArmaanMcleod!)
  • Corrigir unixmode para lidar com setuid e sticky quando o arquivo não for um executável (nº20366)
  • Corrigido o uso de assembly para usar Path.Combine ao construir caminhos de montagem (#21169)
  • Valide o valor para usar namespace durante verificações semânticas para evitar a declaração de namespaces inválidos (#21162)
  • Lidar com a ferramenta global especialmente ao anexar $PSHome ao PATH (# 24228)

Recursos 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 de @jborean93 que melhora o desempenho da += operação 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
}

Ao executar o script no PowerShell 7.4.6, você verá 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

Ao executar o script no PowerShell 7.5-rc.1, você verá 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