web-dev-qa-db-ja.com

PowerShell-インポート方法-Runspaceのモジュール


C#でコマンドレットを作成しようとしています。コードは次のようになります。

[Cmdlet(VerbsCommon.Get, "HeapSummary")]
public class Get_HeapSummary : Cmdlet
{
    protected override void ProcessRecord()
    {
        RunspaceConfiguration config = RunspaceConfiguration.Create();
        Runspace myRs = RunspaceFactory.CreateRunspace(config);
        myRs.Open();

        RunspaceInvoke scriptInvoker = new RunspaceInvoke(myRs);
        scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");

        Pipeline pipeline = myRs.CreatePipeline();
        pipeline.Commands.Add(@"Import-Module G:\PowerShell\PowerDbg.psm1");
        //...
        pipeline.Invoke();

        Collection<PSObject> psObjects = pipeline.Invoke();
        foreach (var psObject in psObjects)
        {
            WriteObject(psObject);
        }
    }
}

しかし、PowerShellでこのCmdLetを実行しようとすると、次のエラーが発生します:Import-Moduleという用語はコマンドレットの名前として認識されません。 PowerShellの同じコマンドでは、このエラーは発生しません。代わりに「Get-Command」を実行すると、「Invoke-Module」がCmdLetとしてリストされていることがわかります。

ランスペースで「インポートモジュール」を実行する方法はありますか?

ありがとう!

13
Absolom

プログラムでモジュールをインポートする方法は2つありますが、最初にその方法について説明します。行pipeline.Commands.Add("...")は、コマンドとパラメーターではなく、コマンドのみを追加する必要があります。パラメータは個別に追加されます。

# argument is a positional parameter
pipeline.Commands.Add("Import-Module");
var command = pipeline.Commands[0];
command.Parameters.Add("Name", @"G:\PowerShell\PowerDbg.psm1")

上記のパイプラインAPIは使用するのが少し不器用で、多くの高レベルAPIのベースになっていますが、多くの用途で非公式に非推奨になっています。 PowerShell v2以降でこれを行う最良の方法は、System.Management.Automation.PowerShellタイプとその流暢なAPIを使用することです。

# if Create() is invoked, a runspace is created for you
var ps = PowerShell.Create(myRS);
ps.Commands.AddCommand("Import-Module").AddArgument(@"g:\...\PowerDbg.psm1")
ps.Invoke()

後者の方法を使用する場合のもう1つの方法は、InitialSessionStateを使用してモジュールをプリロードすることです。これにより、ランスペースにImport-Moduleを明示的にシードする必要がなくなります。その方法については、こちらのブログをご覧ください。

http://nivot.org/nivot2/post/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule.aspx

http://nivot.org/blog/post/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule

お役に立てれば。

22
x0n