
「とりあえずPowerShell 7を入れたら、今まで動いていたスクリプトがエラーになった」
「Active Directoryのコマンドレットが急に使えなくなった」
そんな経験、ありませんか?実はPowerShell 5とPowerShell 7は、見た目こそ似ていますが内部の仕組みからして別物です。今回は、業務スクリプトの設計に直結する「本質的な違い」を10個に整理して解説します。
- そもそも何が違うのか?土台がまったく別
- 1. クロスプラットフォーム対応
- 2. コマンドレットの互換性問題
- 3. 並列処理のしやすさが段違い
- 4. エラーハンドリングがより一貫性を持つように
- 5. 地味に便利な新しい演算子たち
- 6. パフォーマンスの違い
- 7. 標準モジュールの違い
- 8. サポート方針・アップデートの考え方
- 9. リモート接続の選択肢が増えた
- 10. TLSの挙動差
- まとめ:移行するなら「コマンドレット互換性」から確認しよう
そもそも何が違うのか?土台がまったく別
まず押さえておきたいのがこれです。
| PowerShell 5 | PowerShell 7 | |
|---|---|---|
| 動作基盤 | .NET Framework | .NET(.NET Core系) |
| 提供形態 | Windowsに標準搭載 | 別途インストールする独立製品 |
| 対応OS | Windowsのみ | Windows / macOS / Linux |
この「土台の違い」が、これから紹介するさまざまな挙動差の根本原因になっています。
1. クロスプラットフォーム対応
PowerShell 7はWindowsだけでなく、macOSやLinuxでも動作します。裏を返せば、C:\Users\... のようなWindows専用のパス表記や、Windows専用コマンドレットに依存したスクリプトを書いていると、他OSではそのまま動かないという落とし穴があります。
2. コマンドレットの互換性問題
これが実務で一番つまずくポイントです。Active Directoryモジュールや、古いExchange管理シェル、WMIベースの一部コマンドレットなどは、PowerShell 7ではそのまま動作しないことがあります。
救済策としてWindows PowerShell互換性機能が用意されています。
Import-Module ActiveDirectory -UseWindowsPowerShell
ただしこれは内部的にPowerShell 5のプロセスを裏で呼び出して橋渡ししているだけなので、完全に同一の挙動というわけではありません。「動いてはいるが、なんとなく遅い・不安定」と感じたら、この互換モードが原因かもしれません。
3. 並列処理のしやすさが段違い
PowerShell 5で並列処理をしようとすると、Start-Job やランスペースを自前で組む必要があり、正直かなり面倒でした。
PowerShell 7では、こんな一行で並列処理が書けます。
1..10 | ForEach-Object -Parallel { Write-Output $_ } -ThrottleLimit 5
大量のサーバーに対して並行で処理をかけたい、といった場面での恩恵は非常に大きいです。
4. エラーハンドリングがより一貫性を持つように
PowerShell 7では try/catch の中での $Error の扱いや、パイプライン内でのエラー伝播がより一貫性を持つように改善されています。-ErrorAction の挙動や非終端エラーの扱いも細かく調整されており、大規模なスクリプトほど恩恵を感じやすい部分です。
5. 地味に便利な新しい演算子たち
PowerShell 7では、言語機能そのものが拡張されています。個人的に一番「知らないと損」だと思うのがこのあたりです。
- 三項演算子:
$result = $condition ? "Yes" : "No" - Null合体演算子:
$value = $x ?? $default - Null条件代入演算子:
$x ??= $default - パイプラインチェーン演算子:
command1 && command2/command1 || command2
これらはPowerShell 5には存在しません。今までif文で何行も書いていた条件分岐が、一行で書けるようになります。
6. パフォーマンスの違い
一般的に、.NET CoreベースのPowerShell 7の方が起動速度や処理速度で優れているケースが多いです。特に大量データ処理や文字列操作で差が出やすい傾向があります。ただし、モジュールによっては.NET Framework専用の依存関係を持つものもあるため、「7にすれば必ず速くなる」というわけではない点は注意が必要です。
7. 標準モジュールの違い
PowerShell 5は標準モジュールが豊富に組み込まれていますが、PowerShell 7では一部のモジュール(例:Microsoft.PowerShell.SecretManagement など)が別途インストール必要になるケースがあります。「使えると思っていたコマンドレットがない」というトラブルは、大抵このあたりが原因です。
8. サポート方針・アップデートの考え方
| PowerShell 5 | PowerShell 7 | |
|---|---|---|
| 位置づけ | 事実上のメンテナンスモード | 現行の開発ライン |
| 更新内容 | 基本的にセキュリティ更新のみ | 機能追加が継続的に行われる |
| サポート期限 | OSのライフサイクルに準拠 | バージョンごとにLTS/Non-LTSが設定 |
9. リモート接続の選択肢が増えた
PowerShell 7では、Enter-PSSession や Invoke-Command でSSHベースのリモーティングにも対応しています。従来のWindows専用WinRMだけでなく、Linux/macOSともSSH経由で接続できるようになった点は、混在環境を管理する人にとっては大きなメリットです。
10. TLSの挙動差
「.NET Frameworkか.NET Coreか」という土台の違いが原因の一つですが、TLSの挙動が異なります。
- PowerShell 5:
[Net.ServicePointManager]::SecurityProtocolの設定に強く依存し、設定によっては古いTLSバージョンが優先されてしまう - PowerShell 7:既定でOSのセキュリティポリシーに従い、TLS1.2以上を優先する挙動
Exchange Online接続時にPowerShell 5だけエラーになる、という現象の背景にもこの違いがあります。
まとめ:移行するなら「コマンドレット互換性」から確認しよう
- PowerShell 5と7は、動作基盤(.NET Framework / .NET Core)からして別物
- クロスプラットフォーム対応、並列処理、演算子など言語機能の差も大きい
- 一番のつまずきポイントはコマンドレットの互換性(AD、Exchange管理シェル、WMI系など)
- パフォーマンスや構文の面ではPowerShell 7に分があることが多い
- PowerShell 5は事実上メンテナンスモード、今後の機能追加はPowerShell 7側で行われる
既存のWindows PowerShell 5用スクリプトをPowerShell 7に移行する際は、TLSの挙動だけでなく、まずは使用しているモジュールが7で正常に動作するかどうかを確認することをおすすめします。