2015-09-26 2 views
4

У меня есть большое количество команд и, скорее всего, не изменит их всех. Поэтому я хочу превратить объекты команд в объекты кодаблока и добавить их параметры к вызову, чтобы впоследствии выполнить их на другом компьютере.Вставить команду в команду invoke в C#

Конечным результатом является следующий код: Строка сервера = 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#, однако, поскольку я не могу изменить параметры для каждой функции (есть много команд для работы корыта), я хотел бы просто взять команду и выполнить ее.

Edit посмотрев на ответ @Keith холма

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", когда просят добавить followign команду: Команда MaakActiveDirectoryOU = новый Command ("New-ADOrganizationalUnit");

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

Эта команда отлично работает, когда выполняется локально. У кого-нибудь есть ключ?

+0

Почему downvote? Позаботьтесь об этом? – Thijser

+0

И теперь мне любопытно, почему два человека решили понизить, я думаю, что это разумный вопрос? – Thijser

+0

Я тоже не знаю - это хороший вопрос, вы четко излагаете проблемы, вы показываете свои собственные исследовательские усилия, и вопрос задается довольно красиво и идеально по-английски (без опечаток, четкого языка). Я поддержал один раз, чтобы по крайней мере компенсировать одно необъяснимое понижение ... –

ответ

4

Вы не можете назначить строку переменной типа ScriptBlock. Вам нужно создать блок скрипта, используя статический метод создания (Примечание: конструктор ScriptBlock защищен, так что вы не можете использовать его), например:

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

Что касается добавления параметров, попробуйте следующее:

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

Команда Join Linq объединяет две последовательности, но объединенная последовательность выводится в результате команды Join. Он не изменяет ни одну из исходных двух последовательностей.

+0

Основание кажется прекрасным, но есть проблема с параметрами, которые могли бы возникнуть у вас? – Thijser

Смежные вопросы