ホストのモジュールをコピーしてリモートセッションで使えるようにする

PSSessionでリモートPC操作中に自作モジュール使いたいって場合はとてもあるので、やる
やりました

function Copy-Module
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory,Position=0,ParameterSetName='module')]
        [parameter(Mandatory,ValueFromPipeline,ParameterSetName='session')]
        [System.Management.Automation.Runspaces.PSSession]
        $Session,
        [parameter(Mandatory,ValueFromPipeline,ParameterSetName='module')]
        [parameter(Mandatory,Position=0,ParameterSetName='session')]
        [psmoduleinfo] $Module
    )
    process
    {
        $Name   = $Module.Name
        $Script = cat $Module.Path -Encoding Default
        Invoke-Command -Session $Session -ScriptBlock {
            $Modules = $env:PSModulePath -split ';' | ? {$_ -match $env:USERNAME}
            if (! (Test-Path $Modules))
            {
                md $Modules
            }
            $ModuleDir = Join-Path $Modules $args[0]
            if (! (Test-Path $ModuleDir))
            {
                md $ModuleDir
            }
            $args[1] | Out-File $(Join-Path $ModuleDir "$($args[0]).psm1") -Encoding Default
            Import-Module $args[0]
        } -ArgumentList @($Name, $Script)
    }
}

こっちのモジュールファイルの中身をリモートでフォルダとファイル作って書き込むようにしました
ファイルを書いちゃうので一時的な利用というわけにはいかないけどこの際しょうがないな
Import-PSSessionの逆方向版があれば良かったんだけどねぇ

使い方

TestModuleというモジュールがあったとしますね

# TestModule.psm1
function Test-CopyModule
{
    return 'Testing!'
}

リモートでも使えるようにします
Import-Moduleまでやってくれるのでそのまま使えます

PS> $Session = New-PSSession RemoteComputer -Credential RemoteComputer\RemoteUser
PS> Get-Module TestModule | Copy-Module $Session
PS> Invoke-Command -Session $Session -Command {Test-CopyModule}
Testing!
PS> $Session | Enter-PSSession
[RemoteComputer]: PS C:\Users\RemoteUser\Documents> Test-CopyModule
Testing!

使えました
ヨカッタネ

PS> $Session | Copy-Module $(Get-Module TestModule)

PSSessionをパイプで受けることも出来ます、複数の接続先にモジュールを送りたい場合はこっち

ちなみにこれはモジュールフォルダ内にpsm1ファイルだけあるようなシンプルなモジュールしか想定してないので、そうでないモジュールに関してはもちょっと考えてやる必要がある

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中