gpt4 book ai didi

c# - 将命令插入到 C# 中的调用命令中

转载 作者:太空狗 更新时间:2023-10-30 01:17:08 24 4
gpt4 key购买 nike

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

最终结果是如下代码:字符串服务器=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?

应该将命令从 basis 加载到脚本 block 中,以便以后可以用于执行代码和

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

尝试将参数从基础移动到调用脚本中。

我的回答基于 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();

当被要求添加以下命令时,我收到错误消息,即无法通过名称“Name”找到任何参数: Command MaakActiveDirectoryOU = new Command("New-ADOrganizationalUnit");

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

这个命令在本地执行时工作正常有人知道吗?

最佳答案

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

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

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

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

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

关于c# - 将命令插入到 C# 中的调用命令中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32801354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com