次の方法で共有


PowerShell 7.5 の新機能

PowerShell 7.5-rc.1 には、次の機能、更新プログラム、および重大な変更が含まれています。 PowerShell 7.5 は、.NET 9.0.100 GA リリース上に構築されています。

詳細な変更一覧については、GitHub リポジトリの変更ログを参照してください。

重大な変更

  • -OlderThan と日付範囲を使用する場合の -NewerThanTest-Path および PathType パラメーターを修正 (#20942) (感謝します: @ArmaanMcleod!)
    • 以前は、-OlderThan を一緒に指定しても無視されていました
  • New-FileCatalog -CatalogVersion の既定値を 2 に変更 (#20428) (感謝します: @ThomasNieto!)
  • 制限付きリモート処理セッションでのネットワークの場所からのヘルプの表示をブロックする (#20593)
  • Windows インストーラーは、使用されたインストール オプションを記憶し、それらを使用して次のインストールのオプションを初期化するようになりました (#20420) (@reduckted!) に感謝します
  • ConvertTo-JsonBigInteger を数値としてシリアル化するようになりました (#21000) (@jborean93!) に感謝します

更新されたモジュール

PowerShell 7.5-rc.1 には、次の更新されたモジュールが含まれています。

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

タブ補完の改善

タブ補完の改善に関するすべての作業について @ArmaanMcleod と他の方々に感謝します。

  • ハッシュテーブルのキーと値を安全な式から取得できない場合に型の推定にフォールバックする (#21184) (@MartinGC94!) に感謝します
  • $_ の型の推定を行う際の回帰を修正する (#21223) (@MartinGC94!) に感謝します
  • タブ補完を使用して Windows 上で ~$home に展開する (#21529)
  • パラメーター名とクラス メンバーの宣言時には補完を行わない (#21182) (@MartinGC94!) に感謝します
  • 型名のタブ補完時に、ファイルの入力候補へのフォールバックを防止する (#20084) (感謝します: @MartinGC94)
  • -VersionSet-StrictMode に引数の入力候補を追加する (#20554) (感謝します: @ArmaanMcleod!)
  • -VerbGet-Verb/ の Get-Command 引数の入力候補を追加し、Get-Verb をリファクタリングする (#20286) (感謝します: @ArmaanMcleod)
  • -VerbStart-Process 引数の入力候補を追加する (#20415) (感謝します: @ArmaanMcleod)
  • -Scope*-Variable*-Alias コマンドの *-PSDrive 引数の入力候補を追加する (#20451) (感謝します: @ArmaanMcleod)
  • -ModuleSave-Help/ コマンドの Update-Help の入力候補を追加する (#20678) (感謝します: @ArmaanMcleod)

新しいコマンドレット

  • ConvertTo-CliXml コマンドレットと ConvertFrom-CliXml コマンドレットを追加する (#21063) (感謝します: @ArmaanMcleod!)

Web コマンドレットの機能強化

  • -PassThru-Outfile が連携できるように修正しました (#24086)
  • WebResponseObjectOutFile プロパティを追加する (#24047)
  • Invoke-WebRequest -OutFile -Verbose でファイル名を表示する (#24041)
  • -Body は指定されているが ContentType は指定されていない場合の Web コマンドレットを修正する (#23952) (感謝します: @CarloToso!)
  • Invoke-WebRequest 指定時に正しいサイズを報告するように -Resume を修正 (#20207) (感謝します: @LNKLEO!)
  • WinForm アプリが正常に動作するように Web コマンドレットを修正 (#20606)

他のコマンドレットの機能強化

  • -NoRestartRegister-PSSessionConfiguration と連携できるようにする (#23891)
  • IgnoreComments コマンドレットに AllowTrailingCommas オプションと Test-Json オプションを追加する (#23817) (@ArmaanMcleod!) に感謝します
  • Get-Help は、ValueFromRemainingArguments 属性を持つパラメーターをパイプライン可能として報告する場合があります (#23871)
  • LineNumber の種類を ulongSelect-String に変更する (#24075) (@Snowman-25!) に感謝します
  • Get-Process: -IncludeUserName における管理者要件を削除する (#21302) (@jborean93!) に感謝します
  • Test-Path -IsValid が無効なパスとファイル名の文字がないか確認を行うように修正する (#21358)
  • エラー報告の RecommendedActionConciseView を追加する (#20826) (@JustinGrote!) に感謝します
  • Remove-Item の進行状況バーを追加しました (#20778) (@ArmaanMcleod!) に感謝します
  • .NET 8 の変更による Test-Connection の修正 (#20369)
  • Get-Service の強制終了にならないエラー メッセージにカテゴリが含まれるように修正 (#20276)
  • -Empty および -InputObject パラメーターを New-Guid に追加 (#20014) (感謝します: @CarloToso!)
  • r コマンドのパラメーター -Recurse に別名 Get-ChildItem を追加 (#20100) (感謝します: @kilasuit!)
  • 関数の LP 別名に LiteralPath がまだない場合は追加 (#20820)
  • 暗黙的なローカライズのフォールバックを Import-LocalizedData に追加 (#19896) (感謝します: @chrisdent-de!)
  • Aliases によって返されるパラメーターのヘルプ コンテンツの書式設定時に表示されるプロパティに Get-Help を追加 (#20994)
  • HelpUriRemove-Service に追加 (#20476)
  • SCCM プロバイダーの完了クラッシュを修正 (#20815、#20919、#20915) (感謝します: @MartinGC94!)
  • Get-Content-Tail 0 を一緒に使用したときの -Wait での回帰を修正 (#20734) (感謝します: @CarloToso!)
  • 返された Start-Process -PassThru オブジェクトで ExitCode プロパティにアクセスできることを確実にするための Process の修正 (#20749) (感謝します: @CodeCyclone!)
  • 出力に現在のカルチャを使用するように Group-Object を修正 (#20608)
  • 補間された文字列を使った Group-Object 出力を修正 (#20745) (感謝します: @mawosoft!)
  • ネットワーク DisplayRootPSDrive のレンダリングを修正 (#20793)
  • すべてのファイルがコピーされたときにのみ完了と表示するように Copy-Item の進行状況を修正 (#20517)
  • UNC パス補完の回帰を修正 (#20419) (感謝します: @MartinGC94!)
  • 無効な -ExecutionPolicypwsh に渡された場合はエラーを報告する (#20460)
  • 使用状況を追跡する WinGetCommandNotFound および CompletionPredictor モジュールを追加 (#21040)
  • ConvertFrom-Json パラメーターを追加 (#20925) (次の方に感謝: @jborean93!)
  • New-Item の OutputType に DirectoryInfo を追加 (#21126) (次の方に感謝: @MartinGC94!)
  • 配列値の Get-Error のシリアル化を修正 (#21085) (次の方に感謝:
  • UNC パスを使用できるように Test-ModuleManifest を修正 (#24115)
  • 最初にデータを収集するのではなく、パイプラインにすぐに書き込むように Get-TypeData を修正 (#24236) (次の方に感謝: @MartinGC94)
  • ワイルドカード隠しファイルをサポートするための -Force および Resolve-Path コマンドレットに Convert-Path パラメーターを追加する #20981 (次の方に感謝: @ArmaanMcleod!)

エンジンの機能強化

  • ANSI エラー カラーを明示的に開始および停止する (#24065) (次の方に感謝: @JustinGrote!)
  • ジェネリック メソッドの .NET オーバーロード定義を改善する (#21326) (次の方に感謝: @jborean93!)
  • コレクションがオブジェクト配列の場合に += 操作を最適化する (#23901) (次の方に感謝: @jborean93!)
  • モジュールのインポート時に特定のタグの有無を確認するテレメトリを追加する (#20371)
  • モジュール読み込みテレメトリ許可リストに PSAdapterConsoleGuiTools を追加 (#20641)
  • 使用状況を追跡する Winget モジュールを追加 (#21040)
  • WDAC ETW イベントのログ記録時にファイル名が null でないことを確認する (#20910) (感謝します: @jborean93!)
  • WDAC ログ機能によって発生する 4 つの回帰を修正 (#20913)
  • リダイレクトされない場合は入力、出力、エラーのハンドルを未設定のままにする (#20853)
  • 一般的なパラメーターに対して動作するように暗黙的なリモート処理プロキシ コマンドレットを修正 (#20367)
  • モジュールが見つからないときのエラー メッセージにモジュールのバージョンを含める (#20144) (感謝します: @ArmaanMcleod!)
  • ファイルが実行可能でない場合に unixmodesetuid を処理するように sticky を修正 (#20366)
  • アセンブリ パスを構築するときに Path.Combine を使用するためのアセンブリの使用を修正 (#21169)
  • セマンティック チェック中に名前空間を使用して無効な名前空間が宣言されないようにする値を検証 (#21162)
  • PATH の先頭に $PSHome を追加した場合に、グローバル ツールを特に処理する (#24228)

実験的な機能

次の試験的な機能は、PowerShell 7.5-rc.1 のメインストリーム機能に変換されました。

PowerShell 7.5-rc.1 には、次の試験的な機能が含まれています。

パフォーマンスの向上

PowerShell 7.5-rc.1 には、オブジェクトの配列に対する 操作のパフォーマンスを向上させる の PR#23901 含まれています。

次の例では、配列に要素を追加するさまざまな方法のパフォーマンスを測定します。

$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
}

PowerShell 7.4.6 でスクリプトを実行すると、+= 演算子の使用が最も遅い方法であることがわかります。

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

PowerShell 7.5-rc.1 でスクリプトを実行すると、+= 演算子の使用が PowerShell 7.4.6 よりもはるかに高速であることがわかります。 これで、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