2011-11-09 39 views
1

我試圖在以下C#代碼中執行_Get-User -Identity "John Doe" | FL_命令。在C#中執行Powershell命令(get-user -Identity「John Doe」| FL)

 PowerShell powershell = PowerShell.Create(); 
     powershell.AddCommand("get-user"); 
     powershell.AddParameter("Identity", UserName.Text); 
     try 
     { 
      runspace.Open(); 
      powershell.Runspace = runspace; 
      Collection<PSObject> results = powershell.Invoke(); 

      var builder = new StringBuilder(); 
      foreach (var psObject in results) 
      { 
       builder.AppendLine(psObject.ToString() + "\r\n"); 
      } 
      ResultBox.Text = Server.HtmlEncode(builder.ToString()); 
     } 

在哪裏添加_FL_命令?

+1

難道那只是將'results'傳遞給「FL」(一個不同的Powershell命令)嗎?或者,也許你可以使用完整的命令字符串? – 2011-11-09 18:39:09

回答

-1

我不知道你想做的事,因爲這樣的事情可以用C#來完成搜索了很多。您可以更改常規PowerShell腳本而不是「WriteWhatYouWantToDo」。

Runspace runspace = RunspaceFactory.CreateRunspace(); 
runspace.Open(); 
RunspaceInvoke invo = new RunspaceInvoke(runspace); 
invo.Invoke("Set-ExecutionPolicy Unrestricted"); 
Pipeline pipeline = runspace.CreatePipeline(); 

Command command = new Command("get-module -listAvailable | import-module\n" + WriteWhatYouWantToDo); 

pipeline.Commands.Add(command); 
pipeline.Commands.Add("Out-String"); 
try 
{ 
Collection<PSObject> results = pipeline.Invoke(); 
runspace.Close(); 
StringBuilder stringBuilder = new StringBuilder(); 
foreach (PSObject obj in results) 
{ 
stringBuilder.AppendLine(obj.ToString()); 
} 

string result1 = stringBuilder.ToString(); 
string result = result1.Substring(0, 250); //define global scope 
} 
catch (Exception ex) 
{ 

} 
2

當您添加每個命令時,它將被添加到管道中。所以,如果你想要做format-list,您可以添加到管道:

powershell.AddCommand("get-user"); 
    powershell.AddParameter("Identity", UserName.Text); 
    powershell.AddCommand("format-list");' 
    //powershell.AddCommand("out-string"); 

但我使用results

+1

我認爲它不會很好,但它很接近。我會再添加一些這些命令:'powershell.AddCommand(「Out-String」);'。 cmdlet'format-list'不返回格式化文本,它返回用於格式化實際輸出的對象。我們必須觸發這個輸出。 –

+0

@RomanKuzmin - 是的,但這就是爲什麼我在最後一個問題中質疑OP爲什麼需要fl的原因。 – manojlds