で、とりあえず 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 であるのと、関数の引数の渡し方の関係で、ちょっとゴニョゴニョやってる。
もうちょいエレガントな方法はないものか・・・。
トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/193-8a83cf9d