PowerShell 7.7がリリースされました

PowerShell 7.7がリリースされました

.NET 11のリリースに合わせてPowerShell 7.7がリリースされました。本記事では、MSIインストーラー廃止という大きな変更から新機能、セキュリティ強化、破壊的変更まで公開情報をもとにお伝えします。
2026.11.15

しばたです。

先日の.NET 11のリリースと合わせる形でPowerShell 7.7がリリースされました。
PowerShell Team Blogからのアナウンスはこちらになります。

https://devblogs.microsoft.com/powershell/announcing-powershell-7-7/

本記事では公開情報から新機能などをお伝えしたいと思います。

リリース種別とサポートサイクル

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)の利用が推奨される形になりました。

https://devblogs.microsoft.com/powershell/powershell-msi-deprecation/

この変更は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-PSSessionConfiguration
    • Update-Help -Scope AllUsers
    • Enable-ExperimentalFeature -Scope AllUsers
    • Set-ExecutionPolicy -Scope LocalMachine

といったものがあり、ほかにも

  • MSIXをサポートしないServer Coreにはインストール不可

といった制限があります。
Microsoftのドキュメント以外にGitHub上でもいくつかのIssueやディスカッションがあるので紹介しておきます。

MSIX版PowerShellのインストール

MSIX版PowerShellのインストールはMicrosoft Storeからインストールするか、WinGetを使うのが手っ取り早いでしょう。

特にWinGetを使う場合、PowerShell 7.6まではMSI版を提供、PowerShell 7.7からMSIX版に変更という形になったので、最初にMSI版をアンインストールする必要があります。

Windows環境
# Wingetではインストール方式が異なるアップデートができないので最初に既存のMSI版をアンインストールする
winget uninstall --id Microsoft.PowerShell
# MSI版をアンインストールしたあとでMSIX版をインストール
winget install --id Microsoft.PowerShell

また、非公式ではありますが、Remote Desktop Managerなどを販売するDevolutions社が独自にPowerShellをフォークしてMSIインストーラーを提供しています。

その他プラットフォームについて

macOSやLinux環境におけるインストール方法についてはほぼ従来通りです。

新たにAzure Linux 4向けRPMパッケージとArm64 Debian向けDEBパッケージが追加されたのが更新点でしょうか。

PowerShell 7.7 新機能・破壊的変更

PowerShell TeamブログによればPowerShell 7.7はセキュリティ強化と機能改善がメインとのことです。
What's newも合わせて見てみると各コマンドレットとスクリプトエンジンの検証系の改善が多い印象です。

https://learn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-powershell-77?view=powershell-7.7

本記事ではPowerShell Teamブログで案内されている内容をメインに解説していきます。

同梱モジュールの更新

PowerShell 7.7では同梱モジュールのバージョンが以下に更新されています。

  • Microsoft.PowerShell.PSResourceGet v1.3.1
  • PSReadLine v2.4.5

新規コマンドレット、コマンドレットの改善

PowerShell 7.7では新たにNew-TemporaryDirectoryが追加されました。
これまでは一時ファイルを作成するNew-TemporaryFileがありましたが、こちらは一時ディレクトリを作成するコマンドになります。

PowerShell 7.7
# 一時ディレクトリを作成し、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()メソッドを追加

それぞれ簡単な例を出すと次の通りです。

PowerShell 7.7
# 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つだけとされています。

  1. New-Guidコマンドが生成するIDが従来のUUID v4からUUID v7に更新

    • UUID v4を生成したい場合は[Guid]::NewGuid()を使ってください
  2. Format-Table, Format-List, Format-Customコマンドの-PropertyパラメーターがNULL、空文字を不許可に変更

  3. [System.Management.Automation.CompletionResult]型オブジェクト生成時のパラメーター指定ミス時に発生する例外をSystem.Management.Automation.PSArgumentNullExceptionからSystem.ArgumentExceptionに変更

    • もともとString型のパラメーターに空文字列を指定して発生する例外が「Null例外」なのは不適切という指摘から「空文字例外」に直した形
  4. Where-Objectにおいて-[演算子]:$falseの形で条件指定した際の評価を変更

    • 細かい挙動についてはGitHubのIssueを見てもらうのが良いのですが、「正直こんな指定しないだろう」というのが率直なところです。

かなり細かい挙動の変更点ばかりですが、New-Guidだけは結構影響範囲が大きそうですね。

PowerShell 7.7
# 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まで様子を見るかのどちらかになると思います。
みなさん適宜ご判断ください。

この記事をシェアする

関連記事