2014-12-01 58 views
0

我試着用C#執行這個PowerShell命令,並等待輸出,這是我域中的SharePoint網站列表! PowerShell本身工作正常,但使用C#進程調用它,不會等待輸出! 任何意見或建議表示讚賞。使用C調用Powershell命令#

//命令

string cmd = @"[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SharePoint') >  $null 
$farm = [Microsoft.SharePoint.Administration.SPFarm]::Local 
$websvcs = $farm.Services | where -FilterScript {$_.GetType() -eq [Microsoft.SharePoint.Administration.SPWebService]} 
$webapps = @() 
foreach ($websvc in $websvcs) { 
     foreach ($webapp in $websvc.WebApplications) { 
       foreach ($site in $webapp.Sites) { 
       $site.URL 
       } 
     } 
} "; 

// C#的過程!

 Process proc = new Process(); 
     proc.StartInfo = new ProcessStartInfo("powershell.exe", cmd); 
     proc.Start(); 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.StartInfo.UseShellExecute = false; 
     proc.WaitForExit(); 
     string output = ""; 
     while (!proc.HasExited) 
     { 
      output += proc.StandardOutput.ReadToEnd(); 
     } 

回答

0

process.HasExited永遠是true一次proc.WaitForExit()已完成,因此您的while循環將永遠不會輸入並且output將具有其初始值。你並不需要循環,可以改爲僅僅讀取輸出,一旦進程已退出:

proc.WaitForExit(); 
string output = proc.StandardOutput.ReadToEnd(); 

我假設你有想在一個子進程來執行PowerShell代碼具體原因。否則,更好的方法是從@Keith Hill得到答案,或者只是將您的PowerShell代碼轉換爲C#並直接從您的應用程序查詢數據。增加了​​集的引用以及一些using報表。System.Collections.GenericSystem.Linq命名空間後,直接翻譯會是這樣的......

var farm = Microsoft.SharePoint.Administration.SPFarm.Local; 
var websvcs = farm.Services.OfType<Microsoft.SharePoint.Administration.SPWebService>(); 
var siteUrls = new List<string>(); 

foreach (var websvc in websvcs) 
    foreach (var webapp in websvc.WebApplications) 
     foreach (var site in webapp.Sites) 
      siteUrls.Add(site.Url); 

...和更LINQified辦法可以...

var farm = Microsoft.SharePoint.Administration.SPFarm.Local; 
var websvcs = farm.Services.OfType<Microsoft.SharePoint.Administration.SPWebService>(); 
var siteUrls = websvcs 
    .SelectMany(websvc => websvc.WebApplications) 
    .SelectMany(webapp => webapp.Sites) 
    .Select(site => site.Url); 
+0

非常感謝:) – 2014-12-02 22:02:25

+0

@KeithHill非常感謝:) – 2014-12-02 22:02:43

+0

非常感謝,對不起我的小PowerShell體驗: 這是我得到的異常, 例外:您無法在空值表達式上調用方法。\ n行:3 char:50 \ n + $ websvcs = $ farm.Services | -FilterScript {$ _。GetType()-eq – 2014-12-02 23:03:27

0

我會爲此使用PowerShell自動化引擎。在您的C#項目中,參考C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0的程序集System.Management.Automation.dll。然後在你的代碼試試這個:

string cmd = "your commands"; 
string output = ""; 
using (var ps = PowerShell.Create()) 
{ 
    ps.AddScript(cmd); 
    var results = ps.Invoke(); 
    foreach (var result in results) 
    { 
     output += result.ToString(); 
    } 
} 

如果你只在你的輸出獲得的類型名稱,改變這一行:

$site.URL 

到:

$site.URL | Out-String 
+0

非常感謝和抱歉我的小PowerShell的經驗: 這是我得到的例外, 例外:不能CA對一個空值表達式使用方法。\ n行:3 char:50 \ n + $ websvcs = $ farm.Services |其中-FilterScript {$ _。GetType()-eq – 2014-12-02 23:02:38

0
var farm = Microsoft.SharePoint.Administration.SPFarm.Local; 
     var websvcs = farm.Services.OfType<Microsoft.SharePoint.Administration.SPWebService>(); 
     var siteUrls = websvcs 
      .SelectMany(websvc => websvc.WebApplications) 
      .SelectMany(webapp => webapp.Sites) 
      .Select(site => site.Url); 

     foreach (var i in siteUrls) 
     { 
      Console.WriteLine(i.ToString()); 
     }