📘

PowerShellのめんどくさい話

2024/11/19に公開

PowerShell 7

現在、Fabric関連の話をやってて、自分は判っていたけどの面倒くさい話を整理します。
まず、FabricとAzure関連は色々な関係があり、データ転送などで関わることは多いです。
そして、自動実行をしようと思うと、Azure PowerShellモジュールが必要になることがあります。

その上で、まず、現在のAzure PowerShellモジュールでは前提条件として、PowerShell 7が推奨されています。

さて、では、PowerShell 7とは何なのかというのが今回のお題です。

PowerShellの歴史

  1. Windows PowerShell
  • 2006年: Windows PowerShell 1.0リリース
  • 2008年: Windows PowerShell 2.0リリース
  • 2012年: Windows PowerShell 3.0リリース
  • 2013年: Windows PowerShell 4.0リリース
  • 2016年: Windows PowerShell 5.0リリース
  • 2017年: Windows PowerShell 5.1リリース (Windows PowerShellとしての最後のリリース)
  1. PowerShell Core
  • 2018年: PowerShell Core 6.0リリース
  1. PowerShell 7
  • 2020年: PowerShell 7.0リリース(PowerShell Coreの後継)
  • 2021年: PowerShell 7.1リリース
  • 2022年: PowerShell 7.2リリース
  • 2023年: PowerShell 7.3リリース
  • 2024年: PowerShell 7.4リリース
PowerShell バージョン 対応する.NETバージョン
Windows PowerShell 1.0 .NET Framework 2.0
Windows PowerShell 2.0 .NET Framework 2.0, 3.5
Windows PowerShell 3.0 .NET Framework 3.0
Windows PowerShell 4.0 .NET Framework 4.5
Windows PowerShell 5.0 .NET Framework 4.5
Windows PowerShell 5.1 .NET Framework 4.5
PowerShell Core 6.0 .NET Core 2.0
PowerShell Core 6.1 .NET Core 2.1
PowerShell Core 6.2 .NET Core 2.1
PowerShell 7.0(LTS) .NET Core 3.1 (LTS) ⚡(長期サポート対象)
PowerShell 7.1 .NET 5
PowerShell 7.2(LTS) .NET 6 (LTS) ⚡(長期サポート対象)
PowerShell 7.3 .NET 7
PowerShell 7.4(LTS) .NET 8 (LTS) ⚡(長期サポート対象)

大雑把に纏めると、PowerShellにはWindows PowerShellとPowerShell Core以降の
クロスプラットフォーム版の2種類が存在します。

メインテナンス方法の違い

Windows PowerShell

  • 更新方法: Windows Updateを通じて提供されます。
  • ライフサイクル: Windowsオペレーティングシステムのライフサイクルに依存しています。これにより、Windowsのサポート期間中はWindows PowerShellもサポートされます。

PowerShell Core及びPowerShell 7以降

  • 更新方法: 独立しており、GitHubのリリースページや、パッケージマネージャ(例えば、wingetやchocolatey)を使用して手動で更新します。
  • ライフサイクル: 各バージョンは、個々のリリースノートやサポートポリシーに従い、通常は長期サポート(LTS)リリースとそれ以外のリリースに分かれます。LTSリリースはより長期間のサポートを提供します。

従って、Windows PowerShellはWindowsに標準でインストールされており、
Windows Updateでアップデートされます。しかし、PowerShell7は独立しており、Windows Updateで提供されることはありません。PowerShell 7が必要な場合には、別の方法で入手する必要があります。

PowerShellのサポート期限

Windows上に標準でインストールされている、Windows PowerShellはWindows Updateでメインテナンスされている限り、Windowsのサポートサイクルに従います。独立したPowerShellは基本的にはバージョンの小数点の第一位が偶数のものがLTSで長期サポートの対象となります。ただし、現状、PowerShell 7.2も2024年11月8日で既にサポートが終了しているため、アクティブなバージョンは7.4系のみとなります。(PowerShell 7.3は長期サポートの対象ではないため2024年5月8日でサポートが終了しています)

目に見える違い

まず、ファイル名です。Windows PowerShellはPowerShell.exeが本体です。しかし、PowerShell 7ではpwsh.exeが本体です。したがって、PowerShell.exeを実行するとWindows PowerShellが起動し、pwsh.exeを起動すると存在すれば、PowerShell Core 6以降が動きます。したがって、スクリプトからの拡張子関連付けなどはこの部分を考慮する必要があります。

PowerShellに含まれなくなったもの

削除されたモジュール

互換性に関する様々な理由から、次のモジュールはPowerShellに含まれなくなりました。

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

削除されたモジュールの代替方法

ある程度、考えの及ぶ範囲で削除モジュールの代替方法を考えます。

ISE

これは、Visual Studio Codeで代替可能と思われます。他にも洗練されたエディタであれば代替手段としては利用可能でしょう。

PSWorkflow

これは、そうそう簡単にはいきません。.NET的にはCore WFも実装されましたが、GitHubのサイトを見ている限り活発とは程遠く、正直、困難と考えざるを得ない。実装の方針を大きく変えて、Power Automateなどを利用することを考えた方がいいかもしれない。

PSScheduledJobs

これは、SchedulesTasksモジュールに振り替えることになるでしょう。

インストール方法

  1. winget
winget install --id Microsoft.PowerShell --source winget
  1. Chocolately
choco install powershell
  1. Scoop
scoop install powershell
  1. MSIインストーラー
  • PowerShell GitHub リリースページから適切なMSIファイルをダウンロード
  • ダウンロードしたMSIファイルを実行し、インストールウィザードに従ってインストール

アップデート手順

  1. winget

wingetでは以下のコマンドでPowerShellを更新できる。

winget upgrade --id Microsoft.Powershell --source winget

とはいえ、更新されたことを確認しなければならないので、実際には以下のコマンドで確認する。

winget list powershell

以下のような、アウトプットがされる。

名前 ID バージョン 利用可能 ソース
PowerShell 9MZ1SNWT0N5D 7.4.6.0 winget

この表示を確認することで、アップデート版のリリースを確認できる。

  1. Chocolately

Chocolatelyでは、以下のコマンドで更新版がリリースされたことを確認できる。

choco search powershell

更新版がリリースされた場合、次のコマンドで更新できる。

choco upgrade powershell
  1. Scoop

scoopの場合、scoop update powershellでもアップデート可能であるが、まず、アップデートしたことを確認しないとアップデートしようがないので以下の手順になると思われる。

scoop update # アップデートを確認する
scoop status # scoop updateの結果に基づき実際に更新されたプログラムを表示する
scoop update powershell # PowwerShellを更新する

Discussion