PowerShell

2019-09-18

やりたいこと

AWS LambdaでもPowerShellCoreのサポートが開始され、そろそろWindowsPowerShellではなくPowerShellCoreを使って全ての環境で動作するスクリプト/モジュールを作る必要が出てきた。
過去作成したPSM1ファイルをもとにPowerShellCoreの、特にAWSLambda PSCoreにも対応できるような標準的な形式のモジュールを作る。

コマンドレットモジュール(PowerShellCoreに、クラスとして登録する関数)ではなく、function Invoke-SomeFunc() { }で記述するスクリプトモジュール。

前提知識

psm1ファイルで最小限のスクリプトモジュールの作り方。

#sh(ruby){{
# MyModule/MyModule.psm1

function Test-MyModuleFunc() {
Param(
[Parameter(Mandatory = $true, Position = 1)]
[string] $Message,

[Parameter(Mandatory = $false)]
[switch] $DryRun = $false
);

if(!$DryRun) {
}
return;
}
Export-ModuleMember -Function "Test-MyModuleFunc";
}}

モジュールの作成

モジュールマニフェストの作成

New-ModuleManifestコマンドで、モジュールマニフェストファイル(モジュール名.psd1の、モジュールの情報を保存したデータファイル)を生成する。

#sh(ruby){{
New-ModuleManifest -Path /path/to/module/module.psd1
}}

作成されたら中身を適宜変更するが、
特に以下の項目はほぼ必須。

変数名意味記述例
RootModule[string]モジュールは複数ファイルで構成することが可能だが
親となるべきファイルを指定する
"MyModule.psd1"
FunctionsToExport[string[]]モジュールをインポートした時に使うことができるようにする関数名一覧
ワイルドカード表現も可能だが、動作が遅くなる可能性があるとのこと
@("Invoke-MyFunction1", "Register-MyDream", "Unregister-YourDream")

あとはこちらを参考に必要に応じて編集。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/new-modulemanifest?view=powershell-6

モジュール本体の作成

少なくともマニフェストのRootModuleに記載したファイルは作成する。
過去にWindowsPowerShellで作成したModule.psm1があれば文字コード変換*1してそのまま流用可能。

利用

通常のPowerShellCoreで利用

いつもどおり、$Env:PSModulePathに列挙されているフォルダのどこでもいいので、モジュールディレクトリ一式を置く。

AWSLambda PSCore (PowerShell)で利用

メインのモジュールファイルに#Requires指示子を記載する。
https://ss64.com/ps/syntax-requires.html

#sh(ruby){{
#Requires -Modules MyModule
}} あとは、$Env:PSModulePathのどこにでも置けばよく、New-AwsLambdaPackageした時に勝手にパックしてくれる。


*1 PowerShellCoreのLinux版ではUTF-8 LFでないと動作しなかった

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-18 (水) 23:34:01