PowerShellCore(2021年睦月)

# 初めに
こんにちは、本書をご覧になっていただき、ありがとうございます。
少しずつ書き進めています。
[・シリーズ全体構成はこちら](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1#%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90)

## 対象の読者
以下のような方々のお役にたてれば幸いです。

- ソフトウェア開発、特に製造や評価などに関わる人
- Windows用のアプリやツールをコマンドから使いたい人
- Windows用のアプリやツールをスクリプト化して処理したい人

#　PowerShellって何という人への説明

ウィキペディア(日本版)によると、「マイクロソフトが開発した拡張可能なコマンドラインインターフェイス (CLI) シェルおよびスクリプト言語」となっている。**nix系OS(Linux,FreeBSD,MacOS,,,)でのbashなど(sh,tcsh,zsh,,,)にあたる。マイクロソフトのOSには、MS-DOSの時代から、「COMMAND.COM」というコマンドラインシェルがあり、Windows NT 以降では、「cmd.exe」と併用されていた。

余談だが、筆者がパソコンを触り始めた1980年ごろはOSはポピュラーでなく(CP/Mはあったかな？)、シェルとカーネル、ツールなどが一体となったBasic言語が動く環境が主流であった。

# PowerShellのいろいろ
## PowerShell 5.x
2016年8月以降から現在のところ、Windows 10 Anniversary Updateを適用したOS及びWindows Server 2016以降のOSに標準で入っているPoserShellは、5.1となっており、以下のコマンドで確認できる。

```powershell
$PSVersionTable
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/cca6d336-263f-72ab-3555-e4a013de6836.png)

## PoserShell Core 6.x そして PowerShell 7.x[^1]
最近のWindows10でPoserShellを起動すると、最初に以下のような表示があり、そのなかで「新しいクロスプラットフォームの PowerShell」とでてくるので、なんだろうと不思議に思っている読者もいるかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/96d97825-75c4-4402-dbfe-93e8e135bdce.png)

実は、COMMAND.COMからPowerShell5.1までのWindows系シェルは、ロケール(言語設定)の扱いが弱かった。筆者がWSL2になるまでWSLを使わなかったのも、Windows環境でのロケールの弱さが一因であった。「PowerShell Core」は、オープンソースで開発されたシェルで、Linux/MacOSへも移植されている。(2016/08 - 2020/03)　そして、嬉しいことに、既定の文字コードがUTF-8となった。

これまでの Windows PowerShell の場合、Shift-JIS(日本語環境)が標準で、UTF-8やunicode(UTF-16)を指定するとBOM(Byte Order Mark)付になっていた。それで、Linux環境との相性がいまいちであり、コマンドの実行で想定外の動作をしたりして困ることがあった。

情報技術・装置が、もともと西欧圏から始まったこともあり、アルファベットを中心に文字種は7bit(128種類)で表現できていた。世界各国が使用するようになり、文字種も拡張を続けてきた。Unicode系の文字種で統一されつつあるが、現在でも多数の文字コードが残っている。IANAの文字コード表に、世界各国の文字コードが出ているが、日本だけでも相当な種類がある[^6]

「PowerShell Core」の最新版は、「PowerShell 7」であり、Windows PowerShell とは別のディレクトリにインストールされ、Windows PowerShell 5.1 と共存させて実行することができる。

### 特徴(詳細は省略)
- ランタイムとして「.NET Core」 使用
- Windows、macOS、Linuxで動作可能
- コマンドレット
- 統合開発環境「PowerShell ISE」

# PowerShell 7 のインストール
## scoopでインストール
ありがたいことに、@yama-github さんからコメントをいただいた。この記事執筆時ではscoop からのインストールできるバージョンが古いものであったため、手動でのやり方を記述した。現在ではscoopで最新版がインストールできるので、追加しておく。なお、以下ではGlobalインストールしているが、「」を外すことで自分専用でのインストールもできる。

### 確認
powershellにて確認し、インストールする。
```powershell
PS C:\Users\cintake> scoop search pwsh
Results from local buckets...

Name      Version         Source   Binaries
----      -------         ------   --------
pwsh      7.2.6           main
pwsh-beta 7.3.0-preview.7 versions
```
### グローバルインストール
まず、「sudo」をインストールし、それを利用して管理者として「pwsh」をインストールする。
```
PS C:\Users\cintake> scoop install sudo
Installing 'sudo' (0.0.2) [64bit] from jfut bucket
sudo_v0.0.2_windows_amd64.zip (946.3 KB) [====================================================================] 100%
Checking hash of sudo_v0.0.2_windows_amd64.zip ... ok.
Extracting sudo_v0.0.2_windows_amd64.zip ... done.
Linking ~\scoop\apps\sudo\current => ~\scoop\apps\sudo\0.0.2
Creating shim for 'sudo'.
'sudo' (0.0.2) was installed successfully!

PS C:\Users\cintake> sudo scoop install --global pwsh
Installing 'pwsh' (7.2.6) [64bit] from main bucket
Downloading https://github.com/PowerShell/PowerShell/releases/download/v7.2.6/PowerShell-7.2.6-win-x64.zip (103.7 MB)...
Checking hash of PowerShell-7.2.6-win-x64.zip ... done.
Running pre_install script...in-x64.zip ...
Linking C:\ProgramData\scoop\apps\pwsh\current => C:\ProgramData\scoop\apps\pwsh\7.2.6
Creating shim for 'pwsh'.
Adding C:\ProgramData\scoop\shims to global path.
Creating shortcut for PowerShell Core (pwsh.exe)
Persisting Microsoft.PowerShell_profile.ps1
Persisting profile.ps1
Running post_install script...
'pwsh' (7.2.6) was installed successfully!
Notes
-----
Since Scoop uses pwsh.exe internally, to update PowerShell Core itself,
run `scoop update pwsh` from Windows PowerShell, i.e. powershell.exe.

Add PowerShell Core as a explorer context menu by running:
'C:\ProgramData\scoop\apps\pwsh\current\install-explorer-context.reg'
For file context menu, run 'C:\ProgramData\scoop\apps\pwsh\current\install-file-context.reg'
```

## 手動インストール
### インストールの準備
筆者はスクリプトはBashなどで作成することが多いので、PowerShellはあくまでWindows用の補完的なスクリプトを作成するときにしか使わない。最近のWindows環境では、VisualStudioCodeのターミナルなど、PowerShellを使う場面が多くなってきており、どうせ使うならロケールの問題のないCore系を入れたほうが作業効率があがるので、入れている。

1. ノーマルのPowerShellを起動すると表示されるリンク[^1]をたどる
2. インストールのリンクをたどる　＝＞　現在は [PowerShel 7.1 へのリンク](https://docs.microsoft.com/ja-jp/powershell/scripting/windows-powershell/install/installing-windows-powershell?view=powershell-7.1)
3. サポートされるOS[^2]の一部では、前提となるライブラリ[^3]をインストール[^4]
4. [Githubのリリースページ](https://github.com/PowerShell/PowerShell/releases)から該当するバージョン選択[^5]

### インストール
#### １）バージョンの確認
Githubのリリースページでは、最新版が先頭とは限らない。現時点では7.0のパッチバージョンが先頭になっていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/c3e59289-8268-bde2-b232-5c983277b392.png)

#### ２）スクロールして最新版を探
7.1の最新版であるv7.1.1が見つかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/0597d3b4-9dbe-c68a-562e-45e5fec3d8b2.png)

#### ３）リンクをたどるか、下のほうのAssetsの三角マークを広げる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/5c3043cd-8296-c055-4b1c-ad75e3678836.png)

#### ４）ダウンロードして実行
自分の環境に合わせて「PowerShell-7.1.1-win-x64.msi」などを選択してダウンロード。
そのまま実行するか、以下のコマンドでサイレントインストールを実行する。

* 下記コマンドでは、まずscoopでsudoをインストール
* オプションとして３つ指定
    * Explorerのコンテキストメニューに 【Open PowerShell】(PowerShellを開く)を追加
    * PowerShellRemotingを有効化
    * Windows イベント ログのマニフェストを登録
* プログレス表示(/passive)して、Quietモード(自動)(/quiet)で実行

```powershell
cd <ダウンロードした場所>
scoop install sudo
sudo msiexec.exe /package PowerShell-7.1.1-win-x64.msi /quiet /passive ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 ENABLE_PSREMOTING=1 REGISTER_MANIFEST=1
```

#### ５）インストールそのものは他の記事に譲り、ここでは省略
インストーラ起動直後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/350d4ddd-d21f-9f4c-ce01-2109842c4f23.png)
オプションの選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/91612046-ded3-0db7-6d4c-a540f7046f47.png)
インストール中に、以前に入っていた古いバージョンを検出すると、自動的に削除し、新バージョンに更新してくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/01eb1f49-f7e9-586e-498a-213cc5bb0167.png)

#### ６）確認
PATHに「PowerShell 7」が入っていることを確認する。
PowerShell Core系のコマンドはpwsh.exeなので、以下のようにしてパスに入っているかを調べる。
__必ず、Posershellを新しく開くこと。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/1c3614d1-2355-4ef2-b79e-4d68f01e8d81.png)

```powershell
get-command pwsh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/70e2bb18-293b-961d-f8e0-d68a799002a8.png)
「where.exe pwsh」も使えるが、「where pwsh」だとpowershell環境では別の意味を持つために無反応になる。

#### ７）ターミナルの起動
以下のコマンドで「PowerShell Core(現在は7.1)」のターミナルを起動する。

```powershell
start pwsh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/5f0f334e-1095-7142-b024-0bcb4a0220d2.png)

#### ８）バージョンなど
linux系のunameにあたるコマンドレットを実行してみる。

```powershell
get-host
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/052f2316-131f-a3cf-a5f9-3c6c58d7857b.png)

親記事：[WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1)


[^1]: https://aka.ms/pscore6
[^2]: Windows 7 SP1、Server 2008 R2、およびそれ以降のバージョンでサポートされている。
[^3]: 「ユニバーサル C ランタイム」や「Windows Management Framework (WMF) 」が必要
[^4]: [Windows への PowerShell のインストール](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-windows?view=powershell-7.1)
[^5]: GitHubでのPSCoreのリリース配布場所： 頻繁に変更され、Preview版などもあるので注意してバージョンを選択する。　さらに特定バージョン内ではWindows/Mac/Linuxなどのプラットフォーム別にインストールファイルが置いてあるので、自分の環境に合わせて適切なものを選択する。https://github.com/PowerShell/PowerShell/releases
[^6]: 主な日本語文字 Shift_JIS,CP932,EUC-JP,ISO-2022-JP,UTF-8,,, 詳しくは＝＞ [IANAのCharacter Sets](https://www.iana.org/assignments/character-sets/character-sets.xhtml)