社畜の所業

社畜の所業

Microsoft365の機能について解説をしていきたいと思います。このブログの情報をご活用いただければ幸いです。たまに他の情報も取り入れていきたいと思います。

※このサイトはPR記事を含みます。

【Microsoft365参考書】PowerShell 5と7、実は別物だった。移行前に絶対知っておきたい10の違い

PowerShell 5と7、実は別物だった。移行前に絶対知っておきたい10の違い

「とりあえずPowerShell 7を入れたら、今まで動いていたスクリプトがエラーになった」
「Active Directoryのコマンドレットが急に使えなくなった」

そんな経験、ありませんか?実はPowerShell 5とPowerShell 7は、見た目こそ似ていますが内部の仕組みからして別物です。今回は、業務スクリプトの設計に直結する「本質的な違い」を10個に整理して解説します。

 

 

 

そもそも何が違うのか?土台がまったく別

まず押さえておきたいのがこれです。

  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-PSSessionInvoke-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で正常に動作するかどうかを確認することをおすすめします。

 

 

it-bibouroku.hateblo.jp

it-bibouroku.hateblo.jp

it-bibouroku.hateblo.jp