2015-09-26 94 views
4

我有大量的命令,寧願不改變它們全部。所以我想將命令對象變成代碼塊對象,並將它們的參數添加到調用中,以便稍後在另一臺計算機上執行它們。將命令插入到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? 

應加載從基礎的命令插入到腳本塊,因此它可以以後用於執行所述代碼和

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

是從基礎移動參數插入invokescript的嘗試。

我已經根據我的答案上Invoke remote powershell command from C#但我不能改變每個函數的參數(還有很多命令的工作波谷)我想只取指令並執行。後看着@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(); 

我得到的錯誤,沒有參數可以通過名稱時要求添加followign命令「名稱」中找到: 命令MaakActiveDirectoryOU =新命令(「新ADOrganizationalUnit」);

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

這個命令在本地執行時工作正常任何人都有線索?

+0

爲什麼downvote?謹慎解釋? – Thijser

+0

現在我很好奇爲什麼兩個人決定downvote,我認爲這是一個合理的問題? – Thijser

+0

我也不知道 - 這是一個很好的問題,你很清楚地列出了問題,你展示了你自己的研究成果,而且問題問得很好,而且英文完美(沒有錯別字,清晰的語言)。我upvoted至少補償一個無法解釋的downvote ..... –

回答

4

您不能將字符串分配給類型爲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