2013-08-16 30 views
0

我有一個運行powershell腳本的應用程序,我需要保存PowerShell腳本返回的數據。保存動態創建的數據+ c#+ powershell

可能被傳遞給應用程序的腳本的一個例子是:

Get-NetAdapter | Select-Object -Property name, status 

下面是運行腳本並保存結果我的C#代碼:

PowerShell powershell = PowerShell.Create(); 
powershell.Runspace = RunspaceFactory.CreateRunspace(); 
powershell.Runspace.Open(); 
powershell.AddScript(scriptText); 
var results = powershell.Invoke(); 

我然後過濾返回收藏的成員找到我真正需要的人

var firstobject = results[0].Members; 
foreach(PSMemberInfo memberInfo in firstobject) 
{   
    if (!listOfStrings.Contains(memberInfo.Name)) 
    { 
     //Do something with this -- stuck 
    } 
} 

目標是不硬編碼的任何東西,所以我需要動態創建一個表或東西,它可以容納我的返回memberinfo(可以是任何數量的屬性) ,然後我需要獲取所述memberinfo屬性的返回值和THEN以適當的格式將其保存到SQL表中。

我是否在PowerShell輸出中丟失了某些內容,或者是否有格式化輸出的框架,因此使用起來更方便?

如何保存除了項目數量和屬性名稱之外不知道任何內容的數據?

我正在考慮將數據保存到SQL表中,並從那裏將數據加載到某種視圖中。

我試圖找到一個解決方案,將適用於任何數量的屬性 任何幫助將不勝感激。

+0

PSMemberInfo具有諸如Name,Value等屬性,您可以爲其創建表來存儲它們。因此,您可以將任意數量的屬性存儲爲名稱值對。那是你要的嗎? – Mitul

+0

是的,但我不知道要使用哪些屬性。事情是 - 用戶將製作腳本 - 他們將在最後擁有「select-object -property」,但我需要創建它,以便用戶選擇屬性並將應用程序輸出到來自任何成員信息它可以找到。我只是不知道如何 – VisualBean

+0

有沒有一種方法來遍歷PowerShell輸出?這不是一個在psobject中的foreach項目... .value - 以及如何將其鏈接到memberinfo – VisualBean

回答

1

嘗試使用像這樣的Dictionary對象或創建一個自定義類並將每個PSMemberInfo對象存儲到列表中。所以你的表可能只是名稱,值的東西和其他元數據。嘗試評論我們的另一個腳本文本,它具有不同的屬性,並且字典對象仍然獲取所有屬性。爲了演示目的,我只使用結果集中的一個對象。
更新:腳本中沒有第一個,但只是爲了得到返回的對象的類型我正在做powershell.Invoke().First().Members

static void Main(string[] args) 
    { 
     //var scriptText = "Get-Process | Select *"; 
     //var scriptText = "Get-Service"; 
     var scriptText = "Get-Service | Select ServiceName, Status"; 
     PowerShell powershell = PowerShell.Create(); 
     powershell.Runspace = RunspaceFactory.CreateRunspace(); 
     powershell.Runspace.Open(); 
     powershell.AddScript(scriptText); 

     Dictionary<string, object> dictprop = new Dictionary<string, object>(); 

     foreach (PSMemberInfo item in powershell.Invoke().First().Members) 
     { 
      try 
      { 
       dictprop.Add(item.Name, item.Value); 
       Console.WriteLine("Name = {0}, Value = {1}", item.Name, item.Value); 
      } 
      catch (Exception ex) 
      { 
       //Null Value invocation exception. 
      } 

     } 

     Console.Read(); 
    } 
+0

非常好!但是當我不使用時我該怎麼辦?第一? - 沒有在腳本中使用foreach它自己? – VisualBean

+0

好的,你想要存儲返回的對象類型的屬性,而不管返回的對象的數量是多少? – Mitul

+0

檢查腳本文本中沒有第一個的更新答案。 – Mitul