У меня есть большое количество команд и, скорее всего, не изменит их всех. Поэтому я хочу превратить объекты команд в объекты кодаблока и добавить их параметры к вызову, чтобы впоследствии выполнить их на другом компьютере.Вставить команду в команду 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);
Эта команда отлично работает, когда выполняется локально. У кого-нибудь есть ключ?
Почему downvote? Позаботьтесь об этом? – Thijser
И теперь мне любопытно, почему два человека решили понизить, я думаю, что это разумный вопрос? – Thijser
Я тоже не знаю - это хороший вопрос, вы четко излагаете проблемы, вы показываете свои собственные исследовательские усилия, и вопрос задается довольно красиво и идеально по-английски (без опечаток, четкого языка). Я поддержал один раз, чтобы по крайней мере компенсировать одно необъяснимое понижение ... –