C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/12/09 04:00
ScriptBlock クラス (System.Management.Automation)Invoke メソッドInvokeReturnAsIs メソッド を使ってスクリプトブロックを実行すると、スクリプトブロック内の param ステートメントによって宣言されたパラメータには、引数が格納されない。 ( $args 自動変数には格納されるけど。 )

で、とりあえず Pipeline クラス (System.Management.Automation.Runspaces) を使って実現してみた。

public static object InvokeScript(ScriptBlock target, params object[] args)
{
    StringBuilder argsTextBuilder = new StringBuilder();
    if (args != null)
    {
        for (int i = 0; i <= args.Length; i++)
        {
            argsTextBuilder.AppendFormat("`$invokeArgs[{0}] ", i);
        }
    }
    string invokeCommandText = string.Format("`$invokeArgs = `$Input | % {{ `$_; }}; &{{{0}}} {1}", target, argsTextBuilder);
    Command invokeCommand = new Command(invokeCommandText, true, true);
    using (Pipeline invokePipeline = Runspace.DefaultRunspace.CreateNestedPipeline())
    {
        invokePipeline.Commands.Add(invokeCommand);
        Collection<PSObject> invokeResult = invokePipeline.Invoke(args);
        object result = null;
        if ((invokeResult != null) && (invokeResult.Count != 0))
        {
            result = (invokeResult.Count == 1) ? (object)invokeResult[0] : (object)invokeResult;
        }
        return result;
    }
}


$Input が Enumrator であるのと、関数の引数の渡し方の関係で、ちょっとゴニョゴニョやってる。
もうちょいエレガントな方法はないものか・・・。
タグ: .NET C# PowerShell











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/193-8a83cf9d