在c#中执行Powershell脚本文本,将值传递给Param Section中的参数

时间:2018-03-30 19:10:16

标签: c# powershell powershell-v4.0 powershell-remoting

我有一个简单的PowerShell脚本

param
(

   [Parameter(Mandatory=$true)]
   [int]$loop = 2
)

for ($i=0; $i -le $loop; $i++)
{
  $v += get-process
}

$v

我想通过C#执行它。我能够执行简单的脚本,但现在当我想将值传递给$ loop参数时,它说

  

{"由于一个或多个缺少必需项,无法处理命令   参数:循环。"}

我使用以下代码:

using (PowerShell powerShellInstance = PowerShell.Create(RunspaceMode.NewRunspace))
{
    powerShellInstance.Runspace = runspace;
    powerShellInstance.AddScript(script);

    if (parameters != null && parameters.Any())
    {
        foreach (var parameter in parameters)
        {
            if (parameter.Type == ParameterType.Int32)
            {
                int value = Convert.ToInt32(parameter.Value.Trim());
                powerShellInstance.AddParameter(parameter.Name.Trim(), value);
                }
            else
            {
                powerShellInstance.AddParameter(parameter.Name.Trim(), parameter.Value.Trim());
            }
        }
    }

在这里,我在visual studio的调试模式中看到参数名称为 $ loop ,其值通过 Addparameter Api

清楚地设置

但是当我打电话给

时,我得到了上述异常
Collection<PSObject> output = powerShellInstance.Invoke();

不确定,我哪里错了。请帮忙

1 个答案:

答案 0 :(得分:2)

查看代码和脚本的其余部分会有所帮助。需要注意的一点是,参数名称实际上是loop,而不是$loop

以下是一些非常简化的代码,显示了这一点。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Management.Automation;
using System.Text;
using System.Threading.Tasks;

namespace PSTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (PowerShell powerShellInstance = PowerShell.Create(RunspaceMode.NewRunspace))
            {

                var script = "param($param1) $output = 'testing params in C#:' + $param1; $output";
                powerShellInstance.AddScript(script);
                powerShellInstance.AddParameter("param1", "ParamsinC#");
                Collection<PSObject> PSOutput = powerShellInstance.Invoke();

                foreach (PSObject outputItem in PSOutput)
                {

                    if (outputItem != null)
                    {
                        Console.WriteLine(outputItem);
                    }
                }
                Console.ReadKey();

            }
        }
    }
}