2016-12-23 2 views
5

Ich habe ein Powershell-Skript geschrieben, das eine CSV-Datei liest und eine vorher festgelegte Sammlung aus den Daten zurückgibt. Unten ist eine Beispielausgabe dieses Skripts.Powershell PSObject als DataTable in C zurückgeben #

Count  Name 
------ ------ 
    12  Rubies 
    3  Pearls 
    20  Emeralds 

Ich bin in der Lage, die Ergebnisse in C# zu erhalten, indem es in einem PSObject wie so zu speichern:

var shell = PowerShell.Create(); 
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1"); 
Collection<PSObject> results = shell.Invoke(); 

Jetzt, wenn ich ein einzelnes Objekt erwartet, ich bin in der Lage, jeden Wert zu erhalten und Weisen Sie sie Variablen wie folgt zu:

foreach (PSObject psObject in results) 
{ 
    localVariable = Convert.ToString(psObject.Properties["Name"].Value); 
} 

Allerdings habe ich Probleme beim Umwandeln dieser Lösung in eine dynamische. Das heißt, die Anzahl der Zeilen wird voraussichtlich variieren. Also habe ich das bereits implementiert, als die Quelle eine SQL-Datenbank ist, die eine ähnliche Lösung wie die here verwendet, also habe ich angenommen, dass Databases der Weg sein sollten, aber ich kann es in diesem Szenario nicht zum Laufen bringen. Irgendwelche Ideen oder Vorschläge? Vielen Dank!

Hinweis: Die Powershell-Skriptkomponente ist hier obligatorisch, da sie andere Mechanismen zur Formulierung der Ausgabe enthält, während ich mit C# nur aus der CSV-Datei lesen konnte, ist dies einfach keine Option.

+0

Welches Problem haben Sie? Von dem, was ich verstanden habe, iterieren Sie alle Ergebnisse und greifen problemlos auf ihre Eigenschaften zu. Was ist also genau das Problem, das durch die variable Anzahl von Zeilen verursacht wird? –

+0

Hallo Lucas, ich kann nur Werte abrufen, wenn ich weiß, wie viele Zeilen es gibt. (Array-Referenzierung ähnlich wie "Array [0]" oder "Array [1]"). Ich versuche, eine Funktion zu erstellen, die alle Ergebnisse in einer Datentabelle speichern kann.Hoffnung, die es aufklärt. – Yad

+0

Wenn Sie mit einer Foreach-Anweisung iterieren, benötigen Sie keine Array-Referenzierung. Und selbst wenn Sie das tun, können Sie eine for-Anweisung für i

Antwort

1

Was ich aus Ihrer Frage verstanden habe, ist, dass Sie DataTable für weitere Daten verarbeiten möchten und Sie es in Ihrer jeweiligen Sammlung verwenden möchten.

Sie können wie folgt vorgehen:

DataTable dt=new DataTable(); 
dt.Colums.Add("Count"); 
dt.Colums.Add("Name"); 
foreach (PSObject psObject in results) 
{ 
    foreach(PSPropertyInfo prop in psObject.Properties) 
    { 
    var count=prop.Name; 
    var name=prop.Value; 
    //In other words generate output as you desire. 
    dt.Rows.Add(count,name); 
    } 
} 

Hoffe, dass es hilfreich ist für dich.

Dokumentationen vorhanden sind: Doc 1 und Doc 2

1

da Sie bereits mit der Powershell-CSV-Datei zu lesen, warum nicht weiter?

Sie können einen Powershell-Befehl/ein Skript aufrufen, um die Ergebnisse Ihrer * .ps1-Datei zu iterieren, bevor Sie mit der Verwaltung in C# beginnen.

Es ist ziemlich einfach, ein Skript in C# aufzurufen, und Sie müssen das Skript nicht als Datei erstellen. Sie können den Skripttext einfach direkt senden und aufrufen.

vielleicht kann man sogar die 2 ähnlich kombinieren:

var shell = PowerShell.Create(); 
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1 | foreach {do-something $_}"); 
Collection<PSObject> results = shell.Invoke(); 

Beachten Sie, dass ich ein Rohr nach dem Skript Ergebnisse hinzugefügt werden zurückgegeben. Denken Sie daran, dass das "AddScript" sehr ähnlich ist wie das Senden eines Straußes an powershell.exe. Ich habe vorher ganze Skriptdateien von eingebetteten Ressourcen auf diese Methode übertragen.

1

Verwenden Linq:

IEnumerable<dynamic> dynamicResults = from item in results          
             select new { Name = item.Name, Count = item.Count }; 

legen dann die myDataGrid.ItemsSource = dynamicResults;