PowerShell Core 6.0がリリースされました。ダウンロードはGitHubより各プラットフォーム用に公開されています。尚、インストールは全く別の場所に行われますので、既存のWindows PowerShellを残したまま行えるどころか、ZIPファイルでも提供されていますので、インストーラーを実行する必要でさえありません。)
PowerShell CoreはWindows PowerShellのオープンソース、クロスプラットフォーム版で、今後はWindows PowerShellの開発は5.1を最後のバージョンとし、メンテナンス程度になり、こちらの方に注力していくようです。
Windows PowerShellは.NET Frameworkベースになっていますが、PowerShell Coreは、.NET Core、正確には.NET Standardベースのものになっています。そのため、.NET Standardに準拠したライブラリなどは読み込める場合もありますが、Active Directoryなど、一部の機能は使用できませんので、そういった場合はWindows PowerShellと平行して使用することになるかと思います。
PowerShell Coreの何がいいのか?
特にLinuxやWindowsなど複数のプラットフォームを使用している場合において、同様の使用感、及び、スクリプト構文でCUIを利用することができます。尚、execなどの呼び出しに失敗し、挙動がおかしくなる場合があるので、Linux上でpwshに対してchshを行うのはおすすめできません。(目立ったところではSSHのスクリプト実行に失敗したり、Dropboxがゾンビ状態になったりします。)
.NET CoreのモジュールをCUIより呼び出すことが可能なので、例えば以下の要な構文が使えます。
(New-Guid).ToString().ToUpper()
この構文では、New-Guid
はPowerShellのCmdletを使用していますが、これは[Guid]::NewGuid()
とすることもでき、同じ形式の出力になります。
[Guid]::NewGuid().GetType() -eq (New-Guid).GetType()
True
実際はCmdletの実体は.NETのライブラリなので、内部的には同じような構造になっています。
Cmdletは例えば以下のような構成になっています。
using System.Management.Automation;
namespace cmdlettest
{
[Cmdlet(VerbsCommon.Get, "Hello")]
public class TestModule : PSCmdlet
{
[Parameter(Position = 1)]
public string Message { get; set; } = string.Empty;
protected override void EndProcessing()
{
var output = "Hello World";
if (Message != string.Empty)
output += ", " + Message;
WriteObject(output);
base.EndProcessing();
}
}
}
これをコンパイルし、モジュールとして読み込むことで、Get-Hello
のコマンドが使えるようになり、コマンドラインのパーシングなども自動で制御してくれます。もちろん一度コンパイルすると依存として読み込んでいる他のライブラリにプラットフォームの要件がない限りはPowerShell Coreを使用することのできる全ての環境で使用できます。
PowerShell Coreをダウンロードしたらまず行うべきこと
WindowsPSModulePathの導入
Windowsで使用している場合、以下のコマンドでWindowsPSModulePathを導入しておくと便利かも知れません。Windows PowerShellにより提供される一部のライブラリを使用できるようになります。
Install-Module WindowsPSModulePath -Force
ユーザーレベルで入れたい場合は以下のようにもできます。
Install-Module WindowsPSModulePath -CurrentUser -Force
その後、これは以下のコマンドで有効にできます。
Add-WindowsPSModulePath
尚、スタートアップファイルは$PROFILE
ですので、こちらに格納することによりPowerShell起動時に自動的に読み込まれます。
ヘルプファイルの更新
PowerShell Coreでは詳細なヘルプ情報を参照することができます。(UNIX系シェルでいうmanページのようなものです。)
これらのドキュメントは更新する必要があります。それを行うにはUpdate-Help
コマンドを使用します。このコマンドはAdministrator権限(Windows)、root権限(Linux等)で行う必要があります。(尚、Update-Helpが失敗する場合-Force
オプションをつけてやるとうまく行くかも知れません。)
どうしても更新が失敗する場合(UI Culture系の例外が発生する場合)それを無視する設定が必要になります。(日本語のヘルプはないので、英語のロケールを優先指定します。)
-Force -ErrorAction SilentlyContinue -UICulture en-US, ja-JP
更新を行うと、例えばGet-Help Get-Process
などで参照できる他、Get-Process -?
で行うこともできます。
最後に
PowerShell Coreがリリースされたことにより、Windows以外のプラットフォームでもPowerShellの利便性が享受できるようになります。スクリプトはプラットフォームを超えて動作する他、.NET Coreを使用して独自のCmdletを記述することができます。
スクリプト開発環境も整備されており、Visual Studio及び、Visual Studio Codeでスクリプトのデバッグができるようになっています。(Cmdletに関しても上記のように実体は.NETライブラリなので、.NET Core開発環境で開発可能。)
これまで特にWindowsとLinux間など共通のシェルスクリプト的な使い方ができなかったので、この点が便利です。(Windows上でUNIX系シェルを使用するにしても、WSLはほとんど別環境ですし、bashやCygwinなどもOSとしての作法が違うため、不便さがありました。)
NuGet経由で拡張が可能など、.NET Coreの機能が利用できるなど、便利な使い方ができそうです。