将命令插入c#中的invoke命令

时间:2015-09-26 19:53:04

标签: c# powershell parameters remote-access invoke

我有大量的命令,宁愿不改变所有命令。所以我想将命令对象转换为代码块对象并将它们的参数添加到调用中,以便稍后我可以在另一台计算机上执行它们。

最终结果是以下代码: string server = cpu1.com

    public void ExecuteRemote(Command basis) {

        RunspaceInvoke invoke = new RunspaceInvoke();
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        Pipeline pipeLine = runspace.CreatePipeline();
        ScriptBlock s=basis.CommandText);//<<<<this does not work, how can I fix this?

        Command invokeScript = new Command("Invoke-Command");

        invokeScript.Parameters.Add("ComputerName", server);
        invokeScript.Parameters.Add("scriptBlock", s);
        invokeScript.Parameters.Join(basis.Parameters); // and this does not work either?

        pipeLine.Commands.Add(invokeScript);
        Collection<PSObject> commandResults = pipeLine.Invoke();
 }

所以有人知道怎么做吗?

我标记的两行不起作用(不编译),我想知道如何修复它们。

    ScriptBlock s=basis.CommandText);//<<<<this does not work, how can I fix this?

应该将命令从基础加载到scriptblock中,以便稍后可以用于执行代码和

    invokeScript.Parameters.Join(basis.Parameters); // and this does not work either?

尝试将参数从基础移动到invokescript。

我的答案基于Invoke remote powershell command from C#,但因为我无法更改每个函数的参数(有很多命令可以工作)我只想接受命令并执行它。

在查看@Keith hill的回答后编辑

Console.WriteLine(“创建调用”);             RunspaceInvoke invoke = new RunspaceInvoke();

        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        Console.WriteLine("creating pipeline");

        Pipeline pipeLine = runspace.CreatePipeline();
        Console.WriteLine("creating scriptblock");
        ScriptBlock s = ScriptBlock.Create(basis.CommandText);
        Command invokeScript = new Command("Invoke-Command");
        Console.WriteLine("adding parameter1");
        invokeScript.Parameters.Add("ComputerName", "test1.com");

        invokeScript.Parameters.Add("scriptBlock", s);

        foreach (var p in basis.Parameters)            {

            invokeScript.Parameters.Add(p.Name, p.Value);
        }

        pipeLine.Commands.Add(invokeScript); Console.WriteLine("res");
        Collection<PSObject> commandResults = pipeLine.Invoke();

我收到错误,当要求添加followign命令时,名称“Name”找不到任何参数:             命令MaakActiveDirectoryOU = new命令(“New-ADOrganizationalUnit”);

        MaakActiveDirectoryOU.Parameters.Add("Name", KlantNaam);
        MaakActiveDirectoryOU.Parameters.Add("Path", WebConfigurationManager.AppSettings["SharedOU"].ToString());
        ExecuteRemote2(MaakActiveDirectoryOU);

这个命令在本地执行时工作正常任何人都有线索?

1 个答案:

答案 0 :(得分:4)

您无法将字符串分配给ScriptBlock类型的变量。您需要使用静态create方法创建脚本块(注意:ScriptBlock构造函数受到保护,因此您无法使用它),例如:

var s = ScriptBlock.Create(command.CommandText);

至于添加参数,试试这个:

foreach (var p in basis.Parameters) {
    invokeScript.Parameters.Add(p.Name, p.Value);
}

Join Linq命令组合了两个序列,但组合序列作为Join命令的结果输出。它不会修改原始的两个序列。