Moduleに含まれるコマンドレットをScriptBlockに入れてごにょごよしたい。そんな事をふと思ってやってみました。
guitarrapc/PowerShellUtil - Convert-ModuleToScriptBlock/Convert-DModuletoScriptBlock.ps1 | GitHub
Moduleのコマンドレットってどういうこと
PowerShell Moduleには1つ以上のコマンドレットが含まれます。 これらをScriptBlockに入れて利用したり出来ないかなーという興味です。
ちなみにRemoteセッション先でモジュールを使えるようにするImport-PSSessionで役に立ちます。初めはこれをやろうと思って考えてたんですけどねー。
powershell - Import-Pssession is not importing cmdlets when used in a custom module - Stack Overflow
コード
モジュールの内容をScriptBlockに埋め込んでみましょう。
$module = "PSWindowsUpdate" $PSWindowsUpdate = @{} foreach ( $name in (Get-Command -Module $module).Name) { $cmdlet = $name.Replace("-","") $definition = $(Get-Command -module $module | where name -eq $name).Definition $PSWindowsUpdate.$cmdlet = [ScriptBlock]::Create($definition) }
実行するときはスコープに応じて&や.を使います。
HashTableに入っているので、モジュール名のプロパティを呼び出すだけにはなっています。
& $PSWindowsUpdate.GetWUList
問題点
paramを渡せないのが問題です。また、COMがリモートセッション超えられません。 リモートセッション先にあるコマンドレットを叩く手も、課題が残って悔しいです。