17

複数のPowershell関数を含むPS1ファイルがあります。メモリ内のすべての関数とその定義を読み取る静的DLLを作成する必要があります。次に、ユーザーがDLLを呼び出し、関数名と関数のパラメーターを渡すと、これらの関数の1つを呼び出します。

私の質問は、これを行うことは可能ですか?つまり、読み取られてメモリに保存された関数を呼び出しますか?

ありがとう

4

2 に答える 2

19

上記のコードに相当する C# コードを次に示します。

string script = "function Test-Me($param1, $param2) { \"Hello from Test-Me with $param1, $param2\" }";

using (var powershell = PowerShell.Create())
{
    powershell.AddScript(script, false);

    powershell.Invoke();

    powershell.Commands.Clear();

    powershell.AddCommand("Test-Me").AddParameter("param1", 42).AddParameter("param2", "foo");

    var results = powershell.Invoke();
}
于 2014-04-22T11:13:03.013 に答える
5

それは可能であり、複数の方法で可能です。これがおそらく最も単純なものです。

私たちの関数がMyFunctions.ps1スクリプトにあるとすると(このデモでは1つだけ):

# MyFunctions.ps1 contains one or more functions

function Test-Me($param1, $param2)
{
    "Hello from Test-Me with $param1, $param2"
}

次に、以下のコードを使用します。これはPowerShellにありますが、文字通りC#に翻訳できます(これを行う必要があります)。

# create the engine
$ps = [System.Management.Automation.PowerShell]::Create()

# "dot-source my functions"
$null = $ps.AddScript(". .\MyFunctions.ps1", $false)
$ps.Invoke()

# clear the commands
$ps.Commands.Clear()

# call one of that functions
$null = $ps.AddCommand('Test-Me').AddParameter('param1', 42).AddParameter('param2', 'foo')
$results = $ps.Invoke()

# just in case, check for errors
$ps.Streams.Error

# process $results (just output in this demo)
$results

出力:

Hello from Test-Me with 42, foo

PowerShellクラスの詳細については、以下を参照してください。

http://msdn.microsoft.com/en-us/library/system.management.automation.powershell

于 2010-11-15T07:57:53.410 に答える