読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell ModuleのCmdlet を ScriptBlockに格納する

PowerShell
Moduleに含まれる Cmdlet を ScriptBlock に入れてごにょごよしたい。 そんな事をふと思ってやってみました。 役に経つかは微妙ですが、まぁ一応?

ModuleのCmdletってどういうこと

PowerShell Module には1つ以上のCmdlet が含まれます。 これらを ScriptBlockに入れて利用したり出来ないかなーという興味です。 ちなみにRemote Session先での CustomModule のImport-PSSessionについては、この辺が役に立ちます。 初めはこれをやろうと思って考えてたんですけどねー。
http://stackoverflow.com/questions/13502776/import-pssession-is-not-importing-cmdlets-when-used-in-a-custom-module

コード

こんな感じにすることで、 Moduleの内容を 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 が remote session超えれないのとかは変わりませんよ。 Remote Session先にあるコマンドレットを叩くかんじにしても超えれないのでやり方を誰かご存じなら教えてほしいですー。

GitHub

https://github.com/guitarrapc/PowerShellUtil/blob/master/Convert-ModuleToScriptBlock/Convert%EF%BC%8DModuletoScriptBlock.ps1