PowerShellの次期リリースバージョン PowerShell 7 について

# 2019/12/25追記

[Announcing the PowerShell 7.0 Release Candidate](https://devblogs.microsoft.com/powershell/announcing-the-powershell-7-0-release-candidate/)
遂にRCが出ましたね。PowerShell7のGAリリースも間近~~(2020/1)です。~~[2020/2に伸びました](https://twitter.com/theJasonHelmick/status/1217956739766575105?s=20)
上記の記事でPowerShell 7.0の代表的な機能について紹介しています。
プレビューリリースを追いかけている人はご存知かもしれませんが、PowerShell 7.0では素晴らしい改善がいくつかあります。

* .NET Core 3.1 (LTS)
* ForEach-Object -Parallel
* Windows compatibility wrapper
* New version notification
* New error view and Get-Error cmdlet
* Pipeline chain operators (&& and ||)
* Ternary operator (a ? b : c)
* Null assignment and coalescing operators (?? and ??=)
* Cross-platform Invoke-DscResource (experimental)
* Out-GridView, -ShowWindow and other legacy GUI cmdlets are back on Windows
* A ton of awesome quality-of-life improvements too numerous to list out here

個人的にはForEach-ObjectのParallelオプションに追加、パイプラインチェイン(&&やll)、三項演算子が一番うれしい変化です。
特にParallelオプションは簡単に並列処理を実装できて今後重宝すると思います。

また、dotnetのツールになったので、dotnetコマンドでインストールできるようになりました。

```sh
dotnet tool install --global PowerShell --version 7.0.0-rc.1 #インストール
dotnet tool update --global PowerShell --version 7.0.0-rc.1  #アップデート
```

余談ですが2020年にリリース予定の.NET 5によって、これまでの.NET Frameworkや.NET Core, Xamarin/Monoが統合されることになっています。
どうなるのか楽しみですね。

----

以下はプレビューリリースが出る前に書いた以前の記事です。

# 忙しい人向けの要約

- PowerShellの次のリリースバージョン「PowerShell 7」について記事が公開された。
- Windows環境で普及しているWindows PowerShell 5.1を置き換えることが目的の一つになっている。
- PowerShell Core 6をベースに.Net Core 3.0に対応したものになるらしい。
  - PowerShell 7 でWindows/Linux/macOSのPowerShellユーザが.NETCoreの恩恵を受けられるようにしたいとのこと。
  - 既存のWindows PowerShellのモジュールと90%以上の互換性が保たれるとのこと(推測)
- ~~まだプレビューリリースも出てないし特に慌てる必要はない~~  
  ⇒プレビューリリースが始まりました。最新の情報については公式ブログを参照してください。
    https://devblogs.microsoft.com/powershell/
    LTSがリリースされたら改めて記事を書こうと思います。

# 事の発端

Microsoftの開発者ブログで次期PowerShellについての言及がありました。
https://devblogs.microsoft.com/powershell/the-next-release-of-powershell-powershell-7/

詳細は上記ブログを読んでもらったほうが早いです。

正式なリリース発表はまだ未定なので、今のところは過剰に反応する必要は無いと思います。
が、個人的にはPowerShellチームがどんな事を考えていてPowerShell 7 に取り組んでいるのか興味があったので意訳しました。

~~※正式発表の際にはこの記事は内容が古いと思うので削除する予定です。~~

## 超意訳
以下は意訳です。私の英語力が皆無なので期待しないで下さい。
ツッコミ(と云う名の修正)はお待ちしております。


さて、スティーブ氏(の記事を読んだ私)曰く
>
PowerShellチームは、PowerShell Core 6.2をリリースしてから次のリリースに向けて取り組んでるんだ。
その次期リリースをPowerShell 7って呼んでるんだがその理由をこの記事で説明するよ。

>>なぜ6.3ではなく7なのか？
>
PowerShellをマルチプラットフォームで動作するように取り組んできて、ここ2年でLinuxでのpwshの利用は増えてるんだ。嬉しいことにね。
だが、Windowsではpwshがそれほど普及してないんだ。
これはWindows PowerShellユーザがPowerShell Coreと互換のない(サポートされていない)モジュール、Assembly、APIとか使ってるからじゃないかと思ってる。
このユーザたちは、このままだとPowerShell Coreの新しい機能、パフォーマンス向上、バグフィックスなどの恩恵を受けられない。
だから、次のリリースでWindows PowerShell 5.1を完全に置き換えることに私達は尽力していく。
>
このことが意味するのは、Windows PowerShellとPowerShell Coreのユーザ達が同じバージョンのPowerShellでWindows/Linux/macOSでの自動化ができるってことだ。
そして、PowerShell 7 ユーザーは今日も信頼を置いているWindows PowerShellモジュールと非常に高い互換性をもったPowerShellを手に入れることができるってことだ[^1]。
>
(ドキュメンテーションについては中略)
>
注意なんだが、(PowerShellにおいて)メージャーバージョンは重大な変更を加えることを意味するものじゃない。6.0では重大な変更を加えたが、あれはWindows以外のプラットフォームとの互換性を確保するための妥協だったんだ。それ以前のWindows PowerShellはWindowsの新しいバージョンに基づいてメジャーバージョンを更新していたんだ[^2]。
>
>>.NET Core 3.0
>
PowerShell Core6.1は多くのビルドインWindows PowerShellモジュールとの互換性をもたらした。そしてこれは推定だが、PowerShell 7 では未互換のWindows PowerShellモジュールの90%以上が.NET Core 3.0への変更によって互換できるはずだ。(.NET Core 3.0が連れ戻してくる、モジュールに必要な多くAPIを活用すればね(そして、.NET Framework上で構築されいるそれらのAPIが.NET Coreランタイムで動けばね))
例えば、Out-GridViewの復活が期待される(ただしWindowsのみ)[^3]。
>
>>Support Lifecycleの変更
>
現在、PowerShell CoreはMicrosoft Modern Lifecycle Policyの下にある。これはPowerShell Core 6 がfix-forwardであることを意味する。
つまり、セキュリティ上の修正と重大なバグ修正のためにサービスリリースを私達がつくり、そしてマイナーバージョンリリースから6ヶ月以内に提供される最新の安定版を君たちがインストールする必要があるってことだ。
PowerShell 7では.NET Coreのサポートライフサイクルともっと寄り添って共に歩めるように、LTS(Long Term Servicing)と非LTSの両方のリリースを持つことができるようする。
ちなみに早い段階でフィードバックが得られるように毎月プレビューリリースを行う予定だ。
>
>>いつPowerShell7を手に入れられるんだ？
>
最初のプレビューリリースは5月になるかも。
ただ気をつけくれ。これはPowerShellと.NET Core3.0の統合と検証が完了することにかかっているからな。
>
ちなみにPowerShell 7は.NET Coreのタイムラインと連携しているから、一般へのリリース（GA）は.NET Core 3.0のリリース（GA）後になる見込みだ。
>
>>Windowsへの出荷については？
>
PowerShell 7 をWindows PowerShell 5.1と一緒にside-by-side機能として出荷することを計画している。だが、君たちがどのようにこのPowerShell 7 を管理するかについて、いくつかの解決しなければならない項目がまだある。
>
それに、.NET CoreのタイムラインとWindowsのタイムラインが一致していないため、私達は今のところ何も言うことができない。将来のWindows 10またはWindows Serverにいつごろ現れるとかさ。
>
>>PowerShell 7には他にどのような機能がありますか？
>
私達はまだ機能についての計画を終えていないんだ。
だが、PowerShell 7 の機能レベル計画のロードマップが掲載された記事を比較的近いうちにブログに投稿することを予定している。
>
出典：[the-next-release-of-powershell-powershell-7より(上記は意訳)](https://devblogs.microsoft.com/powershell/the-next-release-of-powershell-powershell-7/)
>

## 余談

書いていて思いましたが、Windows PowerShellとPowerShellをやはり明確に分けて記述していますね。
おかげでPowerShellだらけの文章になりました。

ツッコミ、お待ちしています。
(豆腐メンタルなのでお手柔らかにお願いします)

[^1]: 次の意訳。and PowerShell 7 users will have a very high level of compatibility with Windows PowerShell modules they rely on today.
[^2]: おそらく保守的なユーザに向けてPowerShellCore6から破壊的な変更があると勘違いされないように配慮したと思う
[^3]: .NET Core 3.0ではWindowsでしか動かないAPIが実装されるらしい。詳細は要出典。