PowerShell5.1と7.xって何が違うの？

# はじめに
WindowsPowerShellを起動したとき、以下のようなメッセージが出ます。
```
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows
```
毎回これが表示されるのが気になるので、ちょっと調べてみたところ、どうやらPowerShellには今までとは全く違う新しいバージョンがある模様。
ということで、何が違うのか、どっちを使った方がいいのか調べてみました。

# フレームワークの違い
二つのPowerShellの一番大きな違いはフレームワークです。
5.1までの PowerShell では .NET Framework を使用していましたが、PowerShell6.0 以降は .NET Core 上で構築されています。
.NET Framework は Windowsにしか互換性がなかったのに対し、.NET Core では macOS・Linux 上でも動作することができるようになったそうです。

# 両バージョンの互換性
互換性については、一部モジュールが使用できなくなる程度。
.NET Core 3.0の採用によって、モジュールとの互換性が90%以上になる見込みです。
......つまりどういうことだ？
```:GPT4o
つまり、PowerShell 7は従来のWindows PowerShell 5.1と高い互換性を持ち、
これまでのスクリプトやツールがほぼそのまま使えるため、スムーズに移行できる環境が整っています。
```
らしいです。
最終的にはPowerShell7が主流になるのを目指しているのかな？

# セキュリティの強化

長いので表にしました。
| 項目| 詳細|
|----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| AMSI（Windows Antimalware Scan Interface）の拡張 | PowerShell 5.1ではスクリプトブロックをマルウェアスキャンに送信するためにAMSIが導入されたが、PowerShell 7ではさらに拡張され、.NETメソッドメンバーのすべての呼び出しもAMSIに送信されるようになり、潜在的な脅威をより詳細に検出できるようになっている。|
| 制約付き言語モード| 「Constrained Language Mode」は許可されるコマンドレットや.NET型を制限することでシステムを保護し、特に信頼できないスクリプトや環境で役立つ。|
| Webコマンドレットのセキュリティ改善| PowerShell 7では、HTTP接続で資格情報が暗号化されずに送信される場合にエラーが返されるようになり、平文での資格情報送信リスクを軽減。|
| モジュールとスクリプトブロックのログ記録| PowerShell 7はモジュールログ記録とスクリプトブロックログ記録をサポートしており、実行されたコマンドやスクリプトの詳細がイベントログに記録され、不正な操作やスクリプトの追跡が容易に。|
| SSHリモート機能の追加 | PowerShell 7ではSSHベースのリモート機能が統合され、認証キー（KeyFilePath）を使用した安全な接続が可能となり、Windows以外のOSでもセキュアなリモート管理が可能に。|
| Webサービス通信の改善| Webサービス通信では、暗号化された接続や新しいエンドポイント設定により、データ転送のセキュリティが向上。|
| グループポリシーと実行ポリシー| 実行ポリシーにより悪意あるスクリプトの実行を防ぎ、グループポリシー設定でコンピュータやユーザー単位のポリシー適用が可能。|

とかそんなところです。ほかにもいろいろありますが、大きなのはこれぐらい。

# 実際に触ってみた
情報だけ見ていてもしょうがないので、[公式サイト](https://aka.ms/PSWindows)からダウンロードしてきて、実際に新しいPowerShellを触ってみることにしました。

(ユーザー名は塗りつぶしてます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751564/13e8c82f-5c3e-4ff0-83cf-ab6b48bdedda.png)

ぜんぜん今までと見た目変わってないのでびっくりしたんですが、これがPowerShell7.5.0です。
最初の「新しいPowerShellを...!」みたいな文章はなくなりましたね。

# だから私はPowerShell5.1を選ぶ
ちょっとの間新しいPowerShellで遊んでいたんですが、このPowerShell7.5はどうやら英語弱者の私にとって大きな問題を抱えているようです。

「help」と打ちたかったところを間違えて「hekp」と打ってしまったと仮定します。
```css:PowerShell7.5.0
hekp: The term 'hekp' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Suggestion [4,General]: The most similar commands are:
```

......そう、エラーメッセージが英語なのです！！！！
以下のように、5.1の方では日本語で表示してくれるんですが、開発中だからなのか、もしや、これを標準にしていくのか。
```css:PowerShell5.1
hekp : 用語 'hekp' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ hekp
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (hekp:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```
まぁ英語に慣れろって話なんですけどね。
とりあえず私は今まで通りPowerShellは5.1を使い続けたいと思います。誰か日本語パッチを作ってくれないかなー

# 参考サイト
参考にしたサイトです。

https://learn.microsoft.com/ja-jp/powershell/scripting/whats-new/migrating-from-windows-powershell-51-to-powershell-7?view=powershell-7.4

https://learn.microsoft.com/ja-jp/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.5

https://www.detblog.com/powershell-5-1-に-7-0-をインストールしてみた/