
PowerShell 7.7がリリースされました
しばたです。
先日の.NET 11のリリースと合わせる形でPowerShell 7.7がリリースされました。
PowerShell Team Blogからのアナウンスはこちらになります。
本記事では公開情報から新機能などをお伝えしたいと思います。
リリース種別とサポートサイクル
PowerShell 7.7は基盤に.NET 11を使用しておりサポートサイクルも.NET 11のそれに従います。
本日時点では以下のサポート予定です。
| バージョン | サポートポリシー | EOL |
|---|---|---|
| 7.7 | Stable | 2028年11月14日ごろ (記事公開時点ではドキュメント未更新) |
| 7.6 | LTS (Current) | 2028年11月14日 |
| 7.5 | Stable | サポート切れ |
| 7.4 | LTS (Previous) | サポート切れ |
| 7.3 | - | サポート切れ |
| 7.2 | LTS (Previous) | サポート切れ |
| 7.1 | - | サポート切れ |
| 7.0 | LTS (Previous) | サポート切れ |
.NET 11は非LTSバージョンのためPowerShell 7.7はStableリリースとなります。
本記事公開時点ではドキュメントが更新されていませんでしたが、.NET 11のサポート終了となる2028年11月14日ごろまでのサポートになる見込みです。
また、前のLTSであるPowerShell 7.4のサポートがつい先日切れたばかりなのでご注意ください。
PowerShell 7.7の入手方法、更新方法
PowerShell 7.7の入手方法に関して、Windows環境において従来メインで提供されていたMSIインストーラーが廃止され、MSIXパッケージ(.msixbundle)の利用が推奨される形になりました。
この変更はPowerShell 7.7-preview.1のリリース時にPowerShell Team Blogで最初に案内され、当然コミュニティは猛反対した(かつ、現在も半ば炎上気味である)のですが、Microsoft社としては特に明確な回答がないままの現状となっています。
強行リリースと言っても過言でないと個人的には感じています。
一応建前としては『レガシーであるMSIインストーラーを廃し、よりセキュアで新しいMSIXパッケージに切り替える』という体なのですが、MSIXパッケージ版PowerShellにはいくつかの機能制限があり、PowerShell 7.7リリース時点においてもこれらの制限は解消されていません。
MSIX版PowerShellの制限
MSIX版PowerShellの制限については以下のページにまとめられてます。
MSIX版PowerShellは端的に言ってしまうとMicrosoft Storeアプリケーションと同じなのでシステムレベルでの設定変更に制限が掛かっています。
主要なものを挙げると
- 基本ユーザーレベルインストールのみサポート
- PowerShell Remotingは使用不可
$PSHOMEへの書き込みを要するAllUserなプロファイル($PROFILE.AllUsersAllHosts,$PROFILE.AllUsersCurrentHost)は非サポート$PSHOMEへの書き込みを要する以下のコマンドは非サポートRegister-PSSessionConfigurationUpdate-Help -Scope AllUsersEnable-ExperimentalFeature -Scope AllUsersSet-ExecutionPolicy -Scope LocalMachine
といったものがあり、ほかにも
- MSIXをサポートしないServer Coreにはインストール不可
といった制限があります。
Microsoftのドキュメント以外にGitHub上でもいくつかのIssueやディスカッションがあるので紹介しておきます。
- Deprecation of MSI and EXE based installers in lieu of MSIX #27292
- Tracking: MSIX packaging gaps for PowerShell 7 #27565
MSIX版PowerShellのインストール
MSIX版PowerShellのインストールはMicrosoft Storeからインストールするか、WinGetを使うのが手っ取り早いでしょう。
特にWinGetを使う場合、PowerShell 7.6まではMSI版を提供、PowerShell 7.7からMSIX版に変更という形になったので、最初にMSI版をアンインストールする必要があります。
# Wingetではインストール方式が異なるアップデートができないので最初に既存のMSI版をアンインストールする
winget uninstall --id Microsoft.PowerShell
# MSI版をアンインストールしたあとでMSIX版をインストール
winget install --id Microsoft.PowerShell
また、非公式ではありますが、Remote Desktop Managerなどを販売するDevolutions社が独自にPowerShellをフォークしてMSIインストーラーを提供しています。
- 非公式ディストリビューション: Devolutions/pwsh-distro
その他プラットフォームについて
macOSやLinux環境におけるインストール方法についてはほぼ従来通りです。
新たにAzure Linux 4向けRPMパッケージとArm64 Debian向けDEBパッケージが追加されたのが更新点でしょうか。
PowerShell 7.7 新機能・破壊的変更
PowerShell TeamブログによればPowerShell 7.7はセキュリティ強化と機能改善がメインとのことです。
What's newも合わせて見てみると各コマンドレットとスクリプトエンジンの検証系の改善が多い印象です。
本記事ではPowerShell Teamブログで案内されている内容をメインに解説していきます。
同梱モジュールの更新
PowerShell 7.7では同梱モジュールのバージョンが以下に更新されています。
Microsoft.PowerShell.PSResourceGetv1.3.1PSReadLinev2.4.5
新規コマンドレット、コマンドレットの改善
PowerShell 7.7では新たにNew-TemporaryDirectoryが追加されました。
これまでは一時ファイルを作成するNew-TemporaryFileがありましたが、こちらは一時ディレクトリを作成するコマンドになります。
# 一時ディレクトリを作成し、DirectoryInfoオブジェクトを返却する -Prefix パラメーターで任意のプレフィックスを付与可能
PS C:\> $tempDir = New-TemporaryDirectory -Prefix build
PS C:\> $tempDir.FullName
C:\Users\xxxxxxxx\AppData\Local\Temp\buildujfgi5jm.nda
# 使わなくなったら削除
PS C:\> Remove-Item -LiteralPath $tempDir.FullName -Recurse
また、PowerShell Team Blogでは以下の改善点がアナウンスされています。
Join-Pathに-Extensionパラメーターを追加Format-Table,Format-List,Format-Customに-ExcludePropertyを追加Get-AuthenticodeSignatureコマンドの戻り値にSubjectAlternativeNameプロパティを追加- ただ、
-ExcludePropertyを使うとps1xmlで定義されるフォーマット指定を無効化してしまい逆に表示が増えるケースもありました...
- ただ、
System.Management.Automation.WildcardPatternクラスにToRegex()メソッドを追加
それぞれ簡単な例を出すと次の通りです。
# Join-Pathで拡張子 exe を付与
PS C:\> Join-Path $env:TEMP 'pwsh' -Extension exe
C:\Users\xxxxxxxx\AppData\Local\Temp\pwsh.exe
# Format-* なコマンドに -ExcludeProperty が増えた
PS C:\> [PSCustomobject]@{Key="key";Value="Value"} | Format-List -ExcludeProperty key
Value : Value
# Get-AuthenticodeSignature が返す Signature オブジェクトに SubjectAlternativeName が増えた
# いい感じの証明書がなかったのでMSIファイルで代用
PS C:\> Get-AuthenticodeSignature C:\temp\AWSCLIV2.msi | Get-Member
TypeName:System.Management.Automation.Signature
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
IsOSBinary Property bool IsOSBinary {get;}
Path Property string Path {get;}
SignatureType Property System.Management.Automation.SignatureType SignatureType {get;}
SignerCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {ge…
Status Property System.Management.Automation.SignatureStatus Status {get;}
StatusMessage Property string StatusMessage {get;}
SubjectAlternativeName Property string[] SubjectAlternativeName {get;}
TimeStamperCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertificat…
# ワイルドカード指定を正規表現に変換
PS C:\> $pattern = [System.Management.Automation.WildcardPattern]::new("*.txt")
PS C:\> $regex = $pattern.ToRegex()
PS C:\> $regex.IsMatch("file.txt")
True
セキュリティ強化
PowerShell 7.7ではセキュリティ面で以下の変更をしたそうです。
ただ、リリースノートに直接的に変更内容が記載されておらず詳細を見つけるのが困難でした。
Constrained言語モードにおける制限を強化- したらしい...のですが具体的な変更点を見つけることができませんでした。
- PowerShell Remotingにおける実行時引数の検証を強化
- PowerShell Remotingにおける通信フレーム検証を強化
- フレームヘッダ長の検証が追加された模様
- CIMコマンドレットにおけるCDXMLのスキーマ(XSD)検証を強化
- PowerShell Remotingで暗黙的に実行されるコマンドの検証を強化
- 更新可能なヘルプファイル(CABファイル)の検証を強化
- UNIXプラットフォームにおいて
HOME環境変数を見つけられない場合にフォールバックする一時HOMEディレクトリの権限チェックを強化 Test-Jsonコマンドに-FetchExternalReferenceパラメーターが増え、JSONスキーマ内にある外部URLを参照するのに明示的な許可が必要に変更- 別のプルリクに紛れてPowerShell 7.6.10にもバックポートされている模様
その他変更点
その他の変更点からいくつか気になったものをピックアップすると次の通りです。
- ドットで始まる名称に対して
Resolve-Path -Relativeの結果が正しくなかった点を改善 (#28087) Get-Command -UseFuzzyMatchingの結果が重複するバグを修正 (#26593)- 非Windows環境からWindowsへリモート接続した際に
Clear-Hostが失敗するの改善 (#28115) - 全角文字を含む進捗状況の表示崩れを修正 (#26185)
破壊的変更
PowerShell Team BlogおよびWhat's newによれば破壊的変更は以下の4つだけとされています。
-
New-Guidコマンドが生成するIDが従来のUUID v4からUUID v7に更新- UUID v4を生成したい場合は
[Guid]::NewGuid()を使ってください
- UUID v4を生成したい場合は
-
Format-Table,Format-List,Format-Customコマンドの-PropertyパラメーターがNULL、空文字を不許可に変更 -
[System.Management.Automation.CompletionResult]型オブジェクト生成時のパラメーター指定ミス時に発生する例外をSystem.Management.Automation.PSArgumentNullExceptionからSystem.ArgumentExceptionに変更- もともとString型のパラメーターに空文字列を指定して発生する例外が「Null例外」なのは不適切という指摘から「空文字例外」に直した形
-
Where-Objectにおいて-[演算子]:$falseの形で条件指定した際の評価を変更- 細かい挙動についてはGitHubのIssueを見てもらうのが良いのですが、「正直こんな指定しないだろう」というのが率直なところです。
かなり細かい挙動の変更点ばかりですが、New-Guidだけは結構影響範囲が大きそうですね。
# New-Guid がUUID v7のIDを返す様に
PS C:\> (New-Guid).Version
7
PS C:\> New-Guid
Guid
----
01a1d31d-c0c7-7282-af4b-5b238c9fd708
# UUID v4 を得たい場合は [Guid]::NewGuid() を使う
PS C:\> [Guid]::NewGuid().Version
4
PS C:\> [Guid]::NewGuid()
Guid
----
be4868be-2f85-4a42-8778-1a470fa3dd1c
試験的な機能
PowerShell 7.7において昇格した機能は無く、以下の3つの機能が継続して試験的な機能として提供されています。
最後に
以上となります。
何といってもMSIインストーラーの廃止が一番大きな変更点だと思います。
私個人としても「時期尚早だったのでは?」という思いがあり残念ながらポジティブに評価することができません...
とは言っても直ちに現状が変わるわけでは無いので、MSIX版の利用に切り替えていくか、次のLTSとなるPowerShell 7.8まで様子を見るかのどちらかになると思います。
みなさん適宜ご判断ください。





