PowerShell 7.6がリリースされました
しばたです。
昨年11月の.NET 10のリリースから約4ヶ月を経てPowerShell 7.6がリリースされました。
今回はリリースと同時にPowerShell Team Blogでのアナウンスもされています。
本記事では公開情報から新機能などをお伝えしたいと思います。
リリース種別とサポートサイクル
PowerShell 7.6は基盤に.NET 10を使用しておりサポートサイクルも.NET 10のそれに従います。
本日時点では以下のサポート予定です。
| バージョン | サポートポリシー | EOL |
|---|---|---|
| 7.6 | LTS (Current) | 2028年11月14日 |
| 7.5 | Stable | 2026年11月10日 |
| 7.4 | LTS (Previous) | 2026年11月10日 |
| 7.3 | - | サポート切れ |
| 7.2 | LTS (Previous) | サポート切れ |
| 7.1 | - | サポート切れ |
| 7.0 | LTS (Previous) | サポート切れ |
.NET 10はLTSバージョンのためPowerShell 7.6もLTSとなります。
前のLTSである PowerShell 7.4と現行の非LTSバージョンであるPowerShell 7.5が両方とも今年の11月でサポート切れなのでご留意ください。
PowerShell 7.6の入手方法、更新方法
PowerShell 7.6の入手方法やアップデート方法はPowerShell 7 ~ 7.5の時と基本的に同じです。
GitHubリポジトリおよび各種パッケージマネージャからインストール可能です。
詳細な手順はGitHubにある手順をご覧ください。
対応プラットフォーム
PowerShell 7.6を利用可能なプラットフォームは7.4~7.5と同じ様です。
プラットフォーム毎の詳細についてはMicrosoftのドキュメントでご確認ください。
PowerShell 7.6 新機能・破壊的変更
PowerShell TeamブログによればPowerShell 7.6は機能面での安定性やシェルとしての動作改善がメインとなるそうです。
What's newも合わせて見てみると入力補完まわりやスクリプトエンジンの改善がかなり多い印象です。
本記事ではこれらの新機能から主要なところを解説します。
組み込みモジュールの更新
デフォルトで組み込まれるモジュールのバージョンがそれぞれ
- Microsoft.PowerShell.PSResourceGet v1.2.0
- PSReadLine v2.4.5
- Microsoft.PowerShell.ThreadJob v2.2.0
に更新されており、従来のThreadJobモジュールについては名称がMicrosoft.PowerShell.ThreadJobに改名されています。
- v2.1.0 まで : ThreadJob
- v2.1.0 以降 : Microsoft.PowerShell.ThreadJob
タブ補完機能の改善
タブ補完機能が改善されより多くの条件で補完が効く様になったそうです。
What's newを見る限りかなり多くの更新があり、個別に説明するのは難しいのですが、一つだけ例を挙げると
は地味に嬉しいですね。
スコープ指定された変数がスコープ無しの名称から補完できたり、$usingスコープも補完の対象にもなってくれる改善です。
コマンドレットの改善
コマンドレットの改善やバグフィックスも結構ありますが、この中からPowerShell Team Blogで紹介されたものを解説します。
1. Get-Clipboard に -Delimiter パラメーターが追加
Get-Clipboardに新たに-Delimiterが増え、クリップボードに保存された文字列を分割するためのデリミタを指定できる様になりました。
例えばa,b,cという文字列をクリップボードに保存した状態でGet-Clipboardを普通につかうと「"a,b,c"」という1つの文字列が返されますが、-Delimiter ","といった形でデリミタを指定してやると「"a" "b" "c"」の3つの文字列に分けた形で返してくれます。
# クリップボードに "a,b,c" という文字列を保存した状態で実行
PS C:\> Get-Clipboard
a,b,c
# -Delimite パラメーターを指定すると文字列を分割してから返却する
PS C:\> Get-Clipboard -Delimiter ","
a
b
c
PS C:\>
2. Register-ArgumentCompleter に -NativeFallback パラメーターが追加
こちらは利用者独自のタブ補完を登録するRegister-ArgumentCompleterに対する改善です。
従来Register-ArgumentCompleterでは
- PowerShell関数に対する補完を追加するパターン(
-CommandName) - ネイティブコマンドに対する補完を追加するパターン(
-Native)
の二種類の登録ができたのですが、今回新たに-NativeFallbackパラメーターを指定可能になりました。
この-NativeFallbackパラメーターでは「-Nativeパラメーターで登録されたコマンド以外の全てのネイティブコマンド」を対象とした補完ロジックを記述できます。
たとえばAWS CLIでは専用のaws_completerコマンドを使って入力補完ができますが、この様な専用の補完コマンドが無いものに対するロジックを設定するための機能となります。
普段私が使っているcarapace-binを使って新たに以下の様な記述が可能になります。
# 従来機能 : AWS CLI専用の補完設定
Register-ArgumentCompleter -Native -CommandName aws -ScriptBlock {
param($wordToComplete, $commandAst, $cursorPosition)
$env:COMP_LINE = $commandAst.ToString()
$env:COMP_POINT = $cursorPosition
aws_completer | ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
}
Remove-Item Env:\COMP_LINE
Remove-Item Env:\COMP_POINT
}
# PowerShell 7.6新機能 : その他すべてのコマンドに対する補完設定 (carapace-bin を使った例)
Register-ArgumentCompleter -NativeFallback -ScriptBlock {
param($wordToComplete, $commandAst, $cursorPosition)
$commandLine = $commandAst.ToString()
$commandName = $commandLine.Split(' ')[0]
# Nushell形式の候補を取得するほうがvalueだけでなくdescriptionも取れて便利
Invoke-Expression "carapace $commandName nushell $commandLine" | ConvertFrom-Json | ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_.value, $_.value, 'ParameterValue', $_.description)
}
}
その他すべてのコマンドに対するフォールバックの扱いなので登録できるスクリプトブロックは一つだけです。
(最後に登録したもので上書きされる)
スクリプトブロックの登録を止める場合は$nullを指定してください。
3. New-Item の -Target と -Value パラメーターがリテラル文字列として扱われる様に
こちらは元になったプルリクエストを見ていただくのが良いでしょう。
従来New-Itemの-Targetと-Valueパラメーターにおいて[]等のワイルドカード文字が含まれる場合に期待と異なる動作をすることがあったのが改善されました。
このへんのワイルドカードの扱いについては過去に個人ブログでも書いてるので紹介しておきます。
4. Get-Command に -ExcludeModule パラメーターが追加
こちらはシンプルにGet-Commandコマンドに除外パラメーターが追加された感じです。
元になったプルリクエストにある例がユースケースとしてわかりやすかったです。
# Storageモジュール以外で disk を含むコマンドを取得
Get-Command -Name "*disk*" -ExcludeModule Storage
5. Start-Process -Wait における効率の向上
Start-Processコマンドで-Waitパラメーターを指定した際のプロセス終了待ちロジックの内部処理が改善され、また、待ちのキャンセルにも対応したとのことです。
詳細は元になったプルリクエストを見ていただくと良いでしょう。
PowerShellエンジンの改善
PowerShellエンジンの改善についてもPowerShell Team Blogで紹介されたものを解説しておきます。
1. PSForEach() , PSWhere() エイリアスの追加
PowerShell 4.0から追加されたForEach()、Where()メソッドに対しそれぞれPSForEach()、PSWhere()という別名が与えられました。
これはList<T>等にある既存のForEach()、Where()メソッドとの重複に対処するための追加となります。
2. PowerShellStandard.Library にPublic APIを追加
Windows専用機能だが比較的外部モジュールで使われる(もしくは使われやすい)APIをPowerShellStandard.LibraryのPublic APIとして増やし、非Windows環境では何もしない動作にしたとのことです。
対象となったのはSystem.Management.Automation.Security名前空間にあるSystemPolicyクラスとその中の幾つかのメソッドで、Windows OSのセキュリティポリシー設定状況を取得するためのものとなります。
3. X509Certificate2 クラスからDNS名を取得する処理の改善
ちょっとプルリクエストの詳細を読み解けなかったのですが、X509Certificate2クラスで扱う証明書のDNS名(主にSAN)を取得する処理に言語依存の部分があり、非英語言語の環境ではSANの値を取得できなかった不具合が改善された模様です。
4. 標準エラー出力に対して NO_COLOR 環境変数の設定が反映される様に改善
従来からNO_COLOR環境変数の設定が標準出力にしか反映されなかった不具合があり、PowerShell 7.6でそれが解消されたそうです。
試験的な機能からの昇格
PowerShell 7.6では次の試験的な機能が本機能に昇格しました。
1. PSFeedbackProvider
PowerShell 7.4から登場したFeedback Providersが正式機能となりました。
細かい点はこちらの記事をご覧ください。
デフォルトで以下の2つのProviderが組み込まれており、ともに「コマンドが見つからない」エラーの表示を改善するものになります。
- GeneralCommandErrorFeedback
- UnixCommandNotFound
2. PSNativeWindowsTildeExpansion
こちらはホームディレクトリを表す~をPowerShellから外部コマンドに引き渡す際にディレクトリを展開して渡す機能です。
ドキュメントにある例が分かりやすいのでそのまま転記します。
# PowerShell 7.6以前 : ~ は ~ のまま外部プログラムに渡される
PS> cmd.exe /c echo ~
~
# PowerShell 7.6 : ~ が "C:\Users\username" に展開されて外部プログラムに渡される
PS> cmd.exe /c echo ~
C:\Users\username
3. PSRedirectToVariable
これはリダイレクトの結果を変数に保存できる機能です。
リダイレクト先をVariable:{変数名}にすることで保存できます。
追記(>>)の場合はstring[]型の配列に要素を追加する扱いとなり、また、PowerShellの各種ストリーム(2> ~ 6>)それぞれに対応しています。
# > Variable:sample で sample 変数にリダイレクト結果を保存可能
PS C:\> "val1" > Variable:sample
PS C:\> $sample
val1
# > の場合は変数を上書き
PS C:\> "val2" > Variable:sample
PS C:\> $sample
val2
# >> の場合は要素を追加
PS C:\> "val3" >> Variable:sample
PS C:\> $sample
val2
val3
# 2> ~ 6> にも対応
PS C:\> Write-Error "err1" 2> Variable:sample
PS C:\> $sample
Write-Error: err1
PS C:\> Write-Warning "warn1" 3> Variable:sample
PS C:\> $sample
WARNING: warn1
PS C:\> Write-Verbose "verbose1" -Verbose 4> Variable:sample
PS C:\> $sample
VERBOSE: verbose1
PS C:\> Write-Debug "debug1" -Debug 5> Variable:sample
PS C:\> $sample
DEBUG: debug1
PS C:\> Write-Information "info1" -InformationAction Continue 6> Variable:sample
PS C:\> $sample
info1
4. PSSubsystemPluginModel
これはPowerShellエンジンに「サブシステムプラグインモデル」を提供するものです。
PowerShellエンジンの中心となるSystem.Management.Automation.dllに「サブシステム」として別アセンブリから機能登録を可能にします。
利用可能なサブシステムはGet-PSSubsystemコマンドで確認でき、現時点ではCommandPredictor、CrossPlatformDsc、FeedbackProviderの3つ存在します。
# 利用可能なサブシステムの一覧を取得
PS C:\> Get-PSSubsystem
Kind SubsystemType IsRegistered Implementations
---- ------------- ------------ ---------------
CommandPredictor ICommandPredictor False {}
CrossPlatformDsc ICrossPlatformDsc False {}
FeedbackProvider IFeedbackProvider True {General Feedback}
将来的にはJob、CommandCompleter、Remotingといった機能もサブシステムとして分離する方向だそうです。
なお、利用者が独自にサブシステムを作って登録することはできず、将来的な計画もありません。
あくまでもPowerShellエンジンアーキテクチャ改善のための機能となっています。
破壊的変更
What's newによれば破壊的変更は少なく以下の4つだけとされています。
ThreadJobモジュールがMicrosoft.PowerShell.ThreadJobに改名されたことにより、コマンドレットのモジュール修飾名が変わったThreadJob\Start-ThreadJob→Microsoft.PowerShell.ThreadJob\Start-ThreadJob
WildcardPattern.Escape()メソッドでバッククオートがエスケープされないケースが修正された- バグフィックスであるものの既存の挙動がかわるため破壊的変更扱いに
- WildcardPattern.Escape() does not escape lone backticks correctly #16306
Join-Pathコマンドの-ChildPathパラメーターがstring[]の配列を受け入れ可能に変更- シンプルに嬉しい改善ですね
GetHelpCommandトレースソースの名称についていた空白文字列を削除- ソース名に
"GetHelpCommand "と最後に空白文字が付いていたのが"GetHelpCommand"に改善 - Remove trailing space from event source name #24192
- ソース名に
基盤が.NET 10になったことによる挙動の変化も出てくると思うので、将来的にもっと増える可能性はありそうです。
余談 : PowerShell 7.7以降の方向性
先月のPowerShell Team Blogの記事で今年注力する方向とPowerShell 7.7に向けた内容が公開されています。
今後の方向性を知りたい方は一読することをお勧めします。
最後に
以上となります。
PowerShell 7.4 ~ 7.5の方向性を引き継ぎ内部的な改善点の多いリリースという印象です。
ただ、これまでと比べて「地味だけど役に立つ」、「地味に面白い」と感じる更新が多くあり、個人的にはとても良いリリースに思えました。
今回はLTSバージョンですので積極的に更新して利用していくと良いでしょう。






