しばたテックブログ

気分で書いている技術ブログです。

PowerShell on LinuxをDocker上で試す

試した系の記事は既に多くの方がやっていますが、自分も一つくらいは書いとかないといけないかなと思ったので。

インストール手順

ぶっちゃけインストール手順はGitHubに載ってるのでそれを見れば十分です。
実のところ、わざわざこんなエントリ書く必要も無いのですが、そこはご愛敬ということでお許しくださいw

https://github.com/PowerShell/PowerShell/blob/master/docs/installation/docker.mdgithub.com

【2016/09/19変更】

PowerShell 6.0.0.Alpha10からDockerのインストール手順がガラッと変わってしまいました...
Alpha9では単純にサンプルとなるDockerfileだけ公開されていたのですが、いまはlaunch.shによりディストリビューションの選択、安定版や非安定版を設定することができる様になっています。

github.com

以降の内容はAlpha9から更新しませんが、Ubuntuで最低限のビルドを行う手順だ捉えていただければ、と思います。

PowerShell on LinuxをDocker上で試す

実行環境

今回試す環境は以下。

  • 64bit版 Windows 10 Pro RS1(1607)
  • Docker for Windows 1.12

GitHub上にあるDockerfileはUbuntuイメージをベースにしてるのでDocker for Windowsを使いました。
WindowsでなくてもLinuxイメージを扱える環境であれば何でも良いです。

Dockerfile

(Alpha9時点の)Dockerfileの内容はこんな感じ。
ベースイメージに対してPowerShell on Linuxのインストール手順をひとつづつRUNしてるだけなのでとても分かりやすいですね。

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y curl libunwind8 libicu55 libcurl3
RUN curl -LO https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.9/powershell_6.0.0-alpha.9-1ubuntu1.16.04.1_amd64.deb
RUN dpkg -i powershell_6.0.0-alpha.9-1ubuntu1.16.04.1_amd64.deb

Entrypoint [ "powershell" ]

※補足として最後により新しいDockerfileを記載しておきますのでそちらも参考にしてください。

docker build

このDockerfileを適当なディレクトリに配置してdocker buildします。
以下の例はC:\TempにDockerfileを置いた場合です。

cd C:\Temp\
docker build -t powershell .

実行結果はこんな感じです。
各Stepにエラーが無ければOKです。

PS C:\Temp> docker build -t powershell .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu

952132ac251a: Pull complete
82659f8f1b76: Pull complete
c19118ca682d: Pull complete
8296858250fe: Pull complete
24e0251a0e2c: Pull complete
Digest: sha256:f4691c96e6bbaa99d99ebafd9af1b68ace2aa2128ae95a60369c506dd6e6f6ab
Status: Downloaded newer image for ubuntu:16.04
 ---> bd3d4369aebc
Step 2 : RUN apt-get update && apt-get install -y curl  libunwind8 libicu55
 ---> Running in 19bfb1cee4a8
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]

・・・ (中略) ・・・

Updating certificates in /etc/ssl/certs...
173 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
 ---> c43bd397c1af
Removing intermediate container 19bfb1cee4a8
Step 3 : RUN curl -LO https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.9/powershell_6.0.0-alpha.9-1ubuntu1.16.04.1_amd64.deb
 ---> Running in b93ca6e75e85
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   628    0   628    0     0    340      0 --:--:--  0:00:01 --:--:--   340
100 39.0M  100 39.0M    0     0  82054      0  0:08:18  0:08:18 --:--:-- 90143
 ---> f1d271970597
Removing intermediate container b93ca6e75e85
Step 4 : RUN dpkg -i powershell_6.0.0-alpha.9-1ubuntu1.16.04.1_amd64.deb
 ---> Running in 9eefe54aa684
Selecting previously unselected package powershell.
(Reading database ... 7831 files and directories currently installed.)
Preparing to unpack powershell_6.0.0-alpha.9-1ubuntu1.16.04.1_amd64.deb ...
Unpacking powershell (6.0.0-alpha.9-1) ...
Setting up powershell (6.0.0-alpha.9-1) ...
 ---> b3ae5c7c67e8
Removing intermediate container 9eefe54aa684
Step 5 : ENTRYPOINT powershell
 ---> Running in 678e61405749
 ---> 017f3d9a7bd0
Removing intermediate container 678e61405749
Successfully built 017f3d9a7bd0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context wil
l have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

結果の確認

docker imageコマンドで作成したイメージを確認すると以下の様になり、powershellが出来ていることがわかります。

PS C:\Temp> docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
ubuntu                                16.04               bd3d4369aebc        9 hours ago         126.6 MB
powershell                            latest              017f3d9a7bd0        14 hours ago        381.6 MB

docker run

docker runコマンドで作成したイメージからコンテナを起動します。
-itオプションで対話モードでpowershellを起動します。

docker run -it powershell

実行した結果は以下の様になります。

f:id:stknohg:20160828125714p:plain

ホスト環境がWindowsなので若干カーソルの挙動に怪しいところがありますがお試しで使うに分には十分です。
これで気軽にPowerShell on Linuxを試せますね。

おまけ

海外のMVPの方がAlpine LinuxでPowerShellを動かせないか画策している様です。

github.com

Alpine Linuxで動かすことができればベースイメージのサイズも減りますしDockerでPowerShell試すのがもっと気軽になりそうですね。

最新のDockerfile

【2016/09/19 追記】
【2016/10/19 更新】

現時点(alpha11)でのUbuntu16.04安定版のDockerfileの内容です。
本エントリの内容はこちらのDockerfileでも試して動作を確認しています。

FROM ubuntu:xenial
MAINTAINER Andrew Schwartzmeyer <andschwa@microsoft.com>

ARG POWERSHELL_RELEASE=v6.0.0-alpha.11
ARG POWERSHELL_PACKAGE=powershell_6.0.0-alpha.11-1ubuntu1.16.04.1_amd64.deb

# Setup the locale
ENV LANG en_US.UTF-8
ENV LC_ALL $LANG
RUN locale-gen $LANG && update-locale

# Install dependencies and clean up
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        libc6 \
        libcurl3 \
        ca-certificates \
        libgcc1 \
        libicu55 \
        libssl1.0.0 \
        libstdc++6 \
        libtinfo5 \
        libunwind8 \
        libuuid1 \
        zlib1g \
        curl \
        git \
    && rm -rf /var/lib/apt/lists/*

# Install PowerShell package and clean up
RUN curl -SLO https://github.com/PowerShell/PowerShell/releases/download/$POWERSHELL_RELEASE/$POWERSHELL_PACKAGE \
    && dpkg -i $POWERSHELL_PACKAGE \
    && rm $POWERSHELL_PACKAGE

# Use array to avoid Docker prepending /bin/sh -c
ENTRYPOINT [ "powershell" ]

Windows 10のコンテナーとDocker for Windowsを共存させる

いろいろあってちょっと遅くなりましたが

stknohg.hatenablog.jp

の続きです。

2016/10/18 追記

バージョン 1.12.2 Bata26よりDocker for Windowsにdockerd.exeが同梱される様になりGUIでDocker Engineの切り替えができる様になりました。

stknohg.hatenablog.jp

dockerd.exeが同梱されているバージョンであれば以降の手順は不要です。

Windows 10コンテナーのDockerとDocker for Windows

念のため最初に触れておきますが、Windows 10コンテナーのDockerDocker for Windowsは全くの別物です。

Windows 10コンテナーのDockerはWindowsイメージを扱い、Docker Engineとしてdockerd.exeが提供されています。

Docker for WindowsDocker Toolboxの流れをくむツールで、Hyper-V上にLinux仮想マシン(Alpine Linux)を立て、その仮想マシン上にあるDocker EngineがLinuxイメージを扱います。
そして仮想マシンと通信するプロキシサーバーとしてcom.docker.service等が提供されています。

ちなみにクライアントであるdocker.exeは両者共通の様です。

Windows 10のコンテナーとDocker for Windowsを共存させる

以上をふまえてWindows 10のコンテナーとDocker for Windowsを共存させる方法について説明していきます。

0. はじめに

今回は前回の手順でWindows 10コンテナーのDockerをインストールした後にDocker for Windowsをインストールする手順とします。

1. Windows 10コンテナーのDockerの設定変更

理由は後述しますが、デフォルト設定ではWindows 10コンテナーのDockerとDocker for Windowsを同時に起動することはできません。
このため最初にWindows 10コンテナーのDockerサービスを停止しておきます。

# Windows 10コンテナーのDockerサービス(dockerd.exe)の停止
Stop-Service docker

また、現時点ではDocker for Windowsのインストール先はC:\Program Files\Docker\Docker固定です。
部分的にインストールディレクトリが被ってしまうのでWindows 10コンテナーのDockerサービスのインストールディレクトリを変えいておいた方が無難です。

本エントリではインストールディレクトリをC:\Program Files\DockerWinContainerに変更しておきます。

# リネーム
Move-Item 'C:\Program Files\Docker\' 'C:\Program Files\DockerWinContainer\'

# サービス解除+再登録
cd 'C:\Program Files\DockerWinContainer\'
.\dockerd --unregister-service
.\dockerd --register-service

2. Docker for Windowsのインストール

続けてDocker for Windowsをインストールします。
手順はMSIインストーラーを実行して画面の指示に従うだけなので特に私から言うことは無い感じです。

インストールするとPATHにdocker.exeのあるC:\Program Files\Docker\Docker\Resources\binが追加されるので、Windows 10コンテナーのDockerとどちらを優先させるかは適当に設定してくだい。

今回は前回設定したPATHを削除してC:\Program Files\Docker\Docker\Resources\binだけを見る様にします。
これはDocker for Windowsに付いているdocker.exeを使うということになります。

3. Windows 10のコンテナーとDocker for Windowsを共存させる

先ほど言った様にデフォルト設定ではWindows 10コンテナーのDockerとDocker for Windowsを同時に起動することはできません。
理由は単純で、どちらのDockerもデフォルトでは名前付きパイプで待ち受けを行うためポートの競合が起きてしまうのが原因です。

なのでWindows 10のコンテナーとDocker for Windowsを共存させるにはポートの競合が起きない様にどちらかの待ち受けポートを変えてやれば良いです。

今回はWindows 10コンテナーのDockerの方の設定を変えて共存させます。
Dockerの設定についてはMSDNの以下のサイトに詳しく記載されています。

msdn.microsoft.com

こちらによれば、Windows 10コンテナーのDocker Engineの設定はC:\ProgramData\Docker\config\daemon.jsonに設定します。
デフォルトではdaemon.jsonはありませんので新規に作る必要があります。

待ち受けの設定はhostsキーとなり、例えば以下の様にするとTCP 2375番ポートで待ち受けする様になります。

{
    "hosts": ["tcp://0.0.0.0:2375"]
}

PowerShellからだと以下の様な感じでファイルを追加できます。

# -Encodingはutf8だとBOM付きになるからダメ
@"
{
    "hosts": ["tcp://0.0.0.0:2375"]
}
"@ | Out-File -FilePath (Join-Path $env:ProgramData "Docker\config\daemon.json") -Encoding default

これでポートの競合を回避できます。
あとはWindows 10コンテナーのDocker、Docker for Windows両方を起動すればOKです。

4. 確認と接続先の切り替え

最後に起動の確認と両ツールの切り替え方法について説明します。

最初にサービスを確認して両ツールが起動されているのを確認します。

PS C:\> Get-Service *docker*

Status   Name               DisplayName
------   ----               -----------
Running  com.docker.service Docker for Windows Service
Running  docker             Docker Engine

この状態でdocker versionを実行してみます。

# docker.exeはDocker for Windowsについているやつ
PS C:\> where.exe docker
C:\Program Files\Docker\Docker\Resources\bin\docker.exe

# docker version
PS C:\> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:04:48 2016
 OS/Arch:      windows/amd64
 Experimental: true

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:04:48 2016
 OS/Arch:      linux/amd64
 Experimental: true

OS/Arch: linux/amd64とある様にDocker for Windowsに接続していることがわかります。
これはdocker.exeのデフォルトが名前付きパイプで接続する様になっているためです。

(Windowsに限った話ではないですが)Dockerの接続先を変更するにはDOCKER_HOST環境変数を設定してやれば良いです。
前項でWindows 10コンテナーのDocker EngineはTCP 2375版ポートで待ち受けする様にしましたのでDOCKER_HOST環境変数を以下の様に変更します。

$env:DOCKER_HOST="tcp://localhost:2375"

改めてdocker versionを実行すると以下の様に結果が変わります。

# 接続先変更
PS C:\> $env:DOCKER_HOST="tcp://localhost:2375"

# docker version
PS C:\> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:04:48 2016
 OS/Arch:      windows/amd64
 Experimental: true

Server:
 Version:      1.13.0-dev
 API version:  1.25
 Go version:   go1.6.3
 Git commit:   85428a1
 Built:        Fri Aug  5 14:55:24 2016
 OS/Arch:      windows/amd64

OS/Arch: windows/amd64と接続先が切り替わっていることがわかります。

最後に

とりあえずこんな感じです。

ここまでの流れでわかるかと思いますが、クライアント目線で見た場合、Windows 10コンテナーのDockerとDocker for Windowsは単純に個別のDocker Engineであり、片方はLinuxイメージを、もう片方はWindowsイメージを扱うサーバーという体になります。

あとWindows 10コンテナーのDockerは正式にはなんて呼称すれば良いんでしょうね?
ブログ書いてて非常につらかったのでわかる方いましたら是非教えてください。

PowerShell on Linux(Mac)でShift-JISを扱う

【2018/04/04追記】

当初このエントリで紹介したおまじないですが、PowerShell Core 6.0 beta.1の時点でPowerShellの起動時に内部的に呼び出される様になったため(#3467)、以降のバージョンでは何もせずともShift-JISを普通に扱うことができます。

【追記ここまで】


つい先日PowerShellがオープンソース化、クロスプラットフォーム化されてとてもうれしい限りです。

github.com

この件について思うところは結構あるのですが、情報が多くてまだ自分のなかで考えをまとめきれていません(
考えがまとまったらブログに書こうと思います。

PowerShell on Linux(Mac)でShift-JISを扱う

で、現在CentOSおよびMacOS版のPowerShellを適当に触っていたりするのですが、日本人的にShift-JISを扱いたいという要求は多そうだろうなと思い、取り急ぎこのエントリだけでも書こうと思った次第です。

.NET Coreで扱える文字コード

PowerShell on Linux(およびMac)は.NET Core上で動作するアプリケーションです。
よって扱える文字コードは.NET Coreで扱える文字コードと一緒になります。

.NET Coreで扱える文字コードについては@ishisakaさんのブログの以下の記事が詳しいです。

opcdiary.net

こちらの記事にある通り、.NET Coreでは標準ではShift-JIS(MS932)はサポートされておらず、System.Text.Encoding.RegisterProviderを呼ぶ必要があります。

この辺の事情はUWP向けですが以下の記事に詳しく書かれています。

www.atmarkit.co.jp

PowerShell on Linux(Mac)でShift-JISを扱う

このため、PowerShell on Linux(Mac)でShift-JISを扱うには以下のコードを呼ぶ必要があります。

# System.Text.Encoding.RegisterProviderメソッドを呼んでShift-JISを使用可能にする。
[System.Text.Encoding]::RegisterProvider([System.Text.CodePagesEncodingProvider]::Instance)

内容としてはC#のコードを単純にPowerShellで置き換えただけですので特に説明は不要かと思います。
おまじないだと思って実行すればよいでしょう。

【補足】PowerShell on Linux(Mac)で扱える文字コード一覧

補足として以下のコードを実行してPowerShell on Linux(Mac)で使える文字コードの一覧を取得してみます。
System.Text.Encoding.RegisterProviderを呼ぶ部分をコメントアウトするしないで結果を比較してみます。

Test-Encodings.ps1

#! /opt/microsoft/powershell/6.0.0-alpha.9/powershell

# おまじないを入れる or 入れない
# [System.Text.Encoding]::RegisterProvider([System.Text.CodePagesEncodingProvider]::Instance)

for ($i = 0; $i -lt 65535; $i++){
    try{
        $enc = [System.Text.Encoding]::GetEncoding($i)
        Write-Output ("{0}, {1}, {2}" -f $i, $enc.WebName, $enc.EncodingName)
    }
    catch{}
}

Linux (CentOS 7.1)の場合

おまじないのない場合(既定)の結果は以下。

# CentOS 7.1
PS /home/vagrant> ./Test-Encodings.ps1
0, utf-8, Unicode (UTF-8)
1200, utf-16, Unicode
1201, utf-16BE, Unicode (Big-Endian)
12000, utf-32, Unicode (UTF-32)
12001, utf-32BE, Unicode (UTF-32 Big-Endian)
20127, us-ascii, US-ASCII
28591, iso-8859-1, Western European (ISO)
65000, utf-7, Unicode (UTF-7)
65001, utf-8, Unicode (UTF-8)

おまじないを入れた場合の結果は以下。

# CentOS 7.1
PS /home/vagrant> ./Test-Encodings.ps1
0, utf-8, Unicode (UTF-8)
37, ibm037, IBM EBCDIC (US-Canada)
437, ibm437, OEM United States
500, ibm500, IBM EBCDIC (International)
708, asmo-708, Arabic (ASMO 708)
720, dos-720, Arabic (DOS)
737, ibm737, Greek (DOS)
775, ibm775, Baltic (DOS)
850, ibm850, Western European (DOS)
852, ibm852, Central European (DOS)
855, ibm855, OEM Cyrillic
857, ibm857, Turkish (DOS)
858, ibm00858, OEM Multilingual Latin I
860, ibm860, Portuguese (DOS)
861, ibm861, Icelandic (DOS)
862, dos-862, Hebrew (DOS)
863, ibm863, French Canadian (DOS)
864, ibm864, Arabic (864)
865, ibm865, Nordic (DOS)
866, cp866, Cyrillic (DOS)
869, ibm869, Greek, Modern (DOS)
870, ibm870, IBM EBCDIC (Multilingual Latin-2)
874, windows-874, Thai (Windows)
875, cp875, IBM EBCDIC (Greek Modern)
932, shift_jis, Japanese (Shift-JIS)
936, gb2312, Chinese Simplified (GB2312)
949, ks_c_5601-1987, Korean
950, big5, Chinese Traditional (Big5)
1026, ibm1026, IBM EBCDIC (Turkish Latin-5)
1047, ibm01047, IBM Latin-1
1140, ibm01140, IBM EBCDIC (US-Canada-Euro)
1141, ibm01141, IBM EBCDIC (Germany-Euro)
1142, ibm01142, IBM EBCDIC (Denmark-Norway-Euro)
1143, ibm01143, IBM EBCDIC (Finland-Sweden-Euro)
1144, ibm01144, IBM EBCDIC (Italy-Euro)
1145, ibm01145, IBM EBCDIC (Spain-Euro)
1146, ibm01146, IBM EBCDIC (UK-Euro)
1147, ibm01147, IBM EBCDIC (France-Euro)
1148, ibm01148, IBM EBCDIC (International-Euro)
1149, ibm01149, IBM EBCDIC (Icelandic-Euro)
1200, utf-16, Unicode
1201, utf-16BE, Unicode (Big-Endian)
1250, windows-1250, Central European (Windows)
1251, windows-1251, Cyrillic (Windows)
1252, windows-1252, Western European (Windows)
1253, windows-1253, Greek (Windows)
1254, windows-1254, Turkish (Windows)
1255, windows-1255, Hebrew (Windows)
1256, windows-1256, Arabic (Windows)
1257, windows-1257, Baltic (Windows)
1258, windows-1258, Vietnamese (Windows)
1361, johab, Korean (Johab)
10000, macintosh, Western European (Mac)
10001, x-mac-japanese, Japanese (Mac)
10002, x-mac-chinesetrad, Chinese Traditional (Mac)
10003, x-mac-korean, Korean (Mac)
10004, x-mac-arabic, Arabic (Mac)
10005, x-mac-hebrew, Hebrew (Mac)
10006, x-mac-greek, Greek (Mac)
10007, x-mac-cyrillic, Cyrillic (Mac)
10008, x-mac-chinesesimp, Chinese Simplified (Mac)
10010, x-mac-romanian, Romanian (Mac)
10017, x-mac-ukrainian, Ukrainian (Mac)
10021, x-mac-thai, Thai (Mac)
10029, x-mac-ce, Central European (Mac)
10079, x-mac-icelandic, Icelandic (Mac)
10081, x-mac-turkish, Turkish (Mac)
10082, x-mac-croatian, Croatian (Mac)
12000, utf-32, Unicode (UTF-32)
12001, utf-32BE, Unicode (UTF-32 Big-Endian)
20000, x-chinese-cns, Chinese Traditional (CNS)
20001, x-cp20001, TCA Taiwan
20002, x-chinese-eten, Chinese Traditional (Eten)
20003, x-cp20003, IBM5550 Taiwan
20004, x-cp20004, TeleText Taiwan
20005, x-cp20005, Wang Taiwan
20105, x-ia5, Western European (IA5)
20106, x-ia5-german, German (IA5)
20107, x-ia5-swedish, Swedish (IA5)
20108, x-ia5-norwegian, Norwegian (IA5)
20127, us-ascii, US-ASCII
20261, x-cp20261, T.61
20269, x-cp20269, ISO-6937
20273, ibm273, IBM EBCDIC (Germany)
20277, ibm277, IBM EBCDIC (Denmark-Norway)
20278, ibm278, IBM EBCDIC (Finland-Sweden)
20280, ibm280, IBM EBCDIC (Italy)
20284, ibm284, IBM EBCDIC (Spain)
20285, ibm285, IBM EBCDIC (UK)
20290, ibm290, IBM EBCDIC (Japanese katakana)
20297, ibm297, IBM EBCDIC (France)
20420, ibm420, IBM EBCDIC (Arabic)
20423, ibm423, IBM EBCDIC (Greek)
20424, ibm424, IBM EBCDIC (Hebrew)
20833, x-ebcdic-koreanextended, IBM EBCDIC (Korean Extended)
20838, ibm-thai, IBM EBCDIC (Thai)
20866, koi8-r, Cyrillic (KOI8-R)
20871, ibm871, IBM EBCDIC (Icelandic)
20880, ibm880, IBM EBCDIC (Cyrillic Russian)
20905, ibm905, IBM EBCDIC (Turkish)
20924, ibm00924, IBM Latin-1
20932, euc-jp, Japanese (JIS 0208-1990 and 0212-1990)
20936, x-cp20936, Chinese Simplified (GB2312-80)
20949, x-cp20949, Korean Wansung
21025, cp1025, IBM EBCDIC (Cyrillic Serbian-Bulgarian)
21866, koi8-u, Cyrillic (KOI8-U)
28591, iso-8859-1, Western European (ISO)
28592, iso-8859-2, Central European (ISO)
28593, iso-8859-3, Latin 3 (ISO)
28594, iso-8859-4, Baltic (ISO)
28595, iso-8859-5, Cyrillic (ISO)
28596, iso-8859-6, Arabic (ISO)
28597, iso-8859-7, Greek (ISO)
28598, iso-8859-8, Hebrew (ISO-Visual)
28599, iso-8859-9, Turkish (ISO)
28603, iso-8859-13, Estonian (ISO)
28605, iso-8859-15, Latin 9 (ISO)
29001, x-europa, Europa
38598, iso-8859-8-i, Hebrew (ISO-Logical)
50220, iso-2022-jp, Japanese (JIS)
50221, csiso2022jp, Japanese (JIS-Allow 1 byte Kana)
50222, iso-2022-jp, Japanese (JIS-Allow 1 byte Kana - SO/SI)
50225, iso-2022-kr, Korean (ISO)
50227, x-cp50227, Chinese Simplified (ISO-2022)
51932, euc-jp, Japanese (EUC)
51936, euc-cn, Chinese Simplified (EUC)
51949, euc-kr, Korean (EUC)
52936, hz-gb-2312, Chinese Simplified (HZ)
54936, gb18030, Chinese Simplified (GB18030)
57002, x-iscii-de, ISCII Devanagari
57003, x-iscii-be, ISCII Bengali
57004, x-iscii-ta, ISCII Tamil
57005, x-iscii-te, ISCII Telugu
57006, x-iscii-as, ISCII Assamese
57007, x-iscii-or, ISCII Oriya
57008, x-iscii-ka, ISCII Kannada
57009, x-iscii-ma, ISCII Malayalam
57010, x-iscii-gu, ISCII Gujarati
57011, x-iscii-pa, ISCII Punjabi
65000, utf-7, Unicode (UTF-7)
65001, utf-8, Unicode (UTF-8)

MacOSの場合

Macの場合はShebangを

#! /usr/bin/local/powershell

に変えてください。
おまじないのない場合(既定)の結果は以下。

# OS X 10.11.6
PS /Users/stknohg> ./Test-Encoding.ps1                                            
0, utf-8, Unicode (UTF-8)
1200, utf-16, Unicode
1201, utf-16BE, Unicode (Big-Endian)
12000, utf-32, Unicode (UTF-32)
12001, utf-32BE, Unicode (UTF-32 Big-Endian)
20127, us-ascii, US-ASCII
28591, iso-8859-1, Western European (ISO)
65000, utf-7, Unicode (UTF-7)
65001, utf-8, Unicode (UTF-8)

おまじないを入れた場合の結果は以下。

# OS X 10.11.6
PS /Users/stknohg> ./Test-Encoding.ps1                                            
0, utf-8, Unicode (UTF-8)
37, ibm037, IBM EBCDIC (US-Canada)
437, ibm437, OEM United States
500, ibm500, IBM EBCDIC (International)
708, asmo-708, Arabic (ASMO 708)
720, dos-720, Arabic (DOS)
737, ibm737, Greek (DOS)
775, ibm775, Baltic (DOS)
850, ibm850, Western European (DOS)
852, ibm852, Central European (DOS)
855, ibm855, OEM Cyrillic
857, ibm857, Turkish (DOS)
858, ibm00858, OEM Multilingual Latin I
860, ibm860, Portuguese (DOS)
861, ibm861, Icelandic (DOS)
862, dos-862, Hebrew (DOS)
863, ibm863, French Canadian (DOS)
864, ibm864, Arabic (864)
865, ibm865, Nordic (DOS)
866, cp866, Cyrillic (DOS)
869, ibm869, Greek, Modern (DOS)
870, ibm870, IBM EBCDIC (Multilingual Latin-2)
874, windows-874, Thai (Windows)
875, cp875, IBM EBCDIC (Greek Modern)
932, shift_jis, Japanese (Shift-JIS)
936, gb2312, Chinese Simplified (GB2312)
949, ks_c_5601-1987, Korean
950, big5, Chinese Traditional (Big5)
1026, ibm1026, IBM EBCDIC (Turkish Latin-5)
1047, ibm01047, IBM Latin-1
1140, ibm01140, IBM EBCDIC (US-Canada-Euro)
1141, ibm01141, IBM EBCDIC (Germany-Euro)
1142, ibm01142, IBM EBCDIC (Denmark-Norway-Euro)
1143, ibm01143, IBM EBCDIC (Finland-Sweden-Euro)
1144, ibm01144, IBM EBCDIC (Italy-Euro)
1145, ibm01145, IBM EBCDIC (Spain-Euro)
1146, ibm01146, IBM EBCDIC (UK-Euro)
1147, ibm01147, IBM EBCDIC (France-Euro)
1148, ibm01148, IBM EBCDIC (International-Euro)
1149, ibm01149, IBM EBCDIC (Icelandic-Euro)
1200, utf-16, Unicode
1201, utf-16BE, Unicode (Big-Endian)
1250, windows-1250, Central European (Windows)
1251, windows-1251, Cyrillic (Windows)
1252, windows-1252, Western European (Windows)
1253, windows-1253, Greek (Windows)
1254, windows-1254, Turkish (Windows)
1255, windows-1255, Hebrew (Windows)
1256, windows-1256, Arabic (Windows)
1257, windows-1257, Baltic (Windows)
1258, windows-1258, Vietnamese (Windows)
1361, johab, Korean (Johab)
10000, macintosh, Western European (Mac)
10001, x-mac-japanese, Japanese (Mac)
10002, x-mac-chinesetrad, Chinese Traditional (Mac)
10003, x-mac-korean, Korean (Mac)
10004, x-mac-arabic, Arabic (Mac)
10005, x-mac-hebrew, Hebrew (Mac)
10006, x-mac-greek, Greek (Mac)
10007, x-mac-cyrillic, Cyrillic (Mac)
10008, x-mac-chinesesimp, Chinese Simplified (Mac)
10010, x-mac-romanian, Romanian (Mac)
10017, x-mac-ukrainian, Ukrainian (Mac)
10021, x-mac-thai, Thai (Mac)
10029, x-mac-ce, Central European (Mac)
10079, x-mac-icelandic, Icelandic (Mac)
10081, x-mac-turkish, Turkish (Mac)
10082, x-mac-croatian, Croatian (Mac)
12000, utf-32, Unicode (UTF-32)
12001, utf-32BE, Unicode (UTF-32 Big-Endian)
20000, x-chinese-cns, Chinese Traditional (CNS)
20001, x-cp20001, TCA Taiwan
20002, x-chinese-eten, Chinese Traditional (Eten)
20003, x-cp20003, IBM5550 Taiwan
20004, x-cp20004, TeleText Taiwan
20005, x-cp20005, Wang Taiwan
20105, x-ia5, Western European (IA5)
20106, x-ia5-german, German (IA5)
20107, x-ia5-swedish, Swedish (IA5)
20108, x-ia5-norwegian, Norwegian (IA5)
20127, us-ascii, US-ASCII
20261, x-cp20261, T.61
20269, x-cp20269, ISO-6937
20273, ibm273, IBM EBCDIC (Germany)
20277, ibm277, IBM EBCDIC (Denmark-Norway)
20278, ibm278, IBM EBCDIC (Finland-Sweden)
20280, ibm280, IBM EBCDIC (Italy)
20284, ibm284, IBM EBCDIC (Spain)
20285, ibm285, IBM EBCDIC (UK)
20290, ibm290, IBM EBCDIC (Japanese katakana)
20297, ibm297, IBM EBCDIC (France)
20420, ibm420, IBM EBCDIC (Arabic)
20423, ibm423, IBM EBCDIC (Greek)
20424, ibm424, IBM EBCDIC (Hebrew)
20833, x-ebcdic-koreanextended, IBM EBCDIC (Korean Extended)
20838, ibm-thai, IBM EBCDIC (Thai)
20866, koi8-r, Cyrillic (KOI8-R)
20871, ibm871, IBM EBCDIC (Icelandic)
20880, ibm880, IBM EBCDIC (Cyrillic Russian)
20905, ibm905, IBM EBCDIC (Turkish)
20924, ibm00924, IBM Latin-1
20932, euc-jp, Japanese (JIS 0208-1990 and 0212-1990)
20936, x-cp20936, Chinese Simplified (GB2312-80)
20949, x-cp20949, Korean Wansung
21025, cp1025, IBM EBCDIC (Cyrillic Serbian-Bulgarian)
21866, koi8-u, Cyrillic (KOI8-U)
28591, iso-8859-1, Western European (ISO)
28592, iso-8859-2, Central European (ISO)
28593, iso-8859-3, Latin 3 (ISO)
28594, iso-8859-4, Baltic (ISO)
28595, iso-8859-5, Cyrillic (ISO)
28596, iso-8859-6, Arabic (ISO)
28597, iso-8859-7, Greek (ISO)
28598, iso-8859-8, Hebrew (ISO-Visual)
28599, iso-8859-9, Turkish (ISO)
28603, iso-8859-13, Estonian (ISO)
28605, iso-8859-15, Latin 9 (ISO)
29001, x-europa, Europa
38598, iso-8859-8-i, Hebrew (ISO-Logical)
50220, iso-2022-jp, Japanese (JIS)
50221, csiso2022jp, Japanese (JIS-Allow 1 byte Kana)
50222, iso-2022-jp, Japanese (JIS-Allow 1 byte Kana - SO/SI)
50225, iso-2022-kr, Korean (ISO)
50227, x-cp50227, Chinese Simplified (ISO-2022)
51932, euc-jp, Japanese (EUC)
51936, euc-cn, Chinese Simplified (EUC)
51949, euc-kr, Korean (EUC)
52936, hz-gb-2312, Chinese Simplified (HZ)
54936, gb18030, Chinese Simplified (GB18030)
57002, x-iscii-de, ISCII Devanagari
57003, x-iscii-be, ISCII Bengali
57004, x-iscii-ta, ISCII Tamil
57005, x-iscii-te, ISCII Telugu
57006, x-iscii-as, ISCII Assamese
57007, x-iscii-or, ISCII Oriya
57008, x-iscii-ka, ISCII Kannada
57009, x-iscii-ma, ISCII Malayalam
57010, x-iscii-gu, ISCII Gujarati
57011, x-iscii-pa, ISCII Punjabi
65000, utf-7, Unicode (UTF-7)
65001, utf-8, Unicode (UTF-8)