2016-12-23 41 views
5

Napisałem skrypt Powershell, który odczytuje plik CSV i zwraca wcześniej określoną kolekcję z danych. Poniżej znajduje się przykładowy wynik tego skryptu.Powracający PSObject jako DataTable w C#

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

jestem w stanie uzyskać wyniki w C# poprzez przechowywanie go w PSObject tak:

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

Teraz, kiedy jestem spodziewa pojedynczy obiekt, jestem w stanie uzyskać każdą wartość i przypisz je do zmiennych takich jak to:

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

Mam jednak problem z przekonwertowaniem tego rozwiązania na dynamiczne. Oznacza to, że liczba wierszy ma się różnić. Więc zaimplementowałem to wcześniej, gdy źródłem jest baza danych SQL, używając rozwiązania podobnego do tego, które zostało opublikowane here, więc założyłem, że datatables powinien być drogą, ale nie mogę go uruchomić w tym scenariuszu. Wszelkie pomysły i sugestie? Dzięki!

Uwaga: Komponent skryptu Powershell jest tutaj obowiązkowy, ponieważ zawiera inne mechanizmy formułowania danych wyjściowych, więc chociaż mogłem po prostu odczytać z pliku CSV przy użyciu C#, nie jest to po prostu opcja.

+0

Jaki masz problem? Z tego co zrozumiałem, iterujesz wszystkie wyniki i uzyskując dostęp do jego właściwości bez żadnego problemu, więc jaki jest dokładny problem powodowany przez zmienną liczbę linii? –

+0

Cześć Lucas, jestem w stanie pobrać tylko wartości, jeśli wiem, ile jest tam wierszy. (tablica jest podobna do 'tablica [0]' lub 'tablica [1]). Próbuję utworzyć funkcję, która może przechowywać wszystkie wyniki w datatable.Mam nadzieję, że to wyczyści. – Yad

+0

Podczas iteracji z instrukcją foreach nie potrzebujesz odwołania do tablicy. A nawet jeśli to zrobisz, możesz użyć instrukcji for dla

Odpowiedz

1

Co zrozumiałem z pytaniem jest to, że chcesz mieć DataTable dla dalszego procesu danych i chcesz używać go w odpowiedniej kolekcji.

można postępować tak:

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); 
    } 
} 

nadzieję, że to pomocne dla Ciebie.

Dokumentacje obecne są: Doc 1 i Doc 2

1

skoro już przy użyciu PowerShell do odczytu pliku csv, dlaczego nie kontynuować?

Można powołać się na powershell poleceń/script iteracyjne wyniki swojej .ps1 pliku * Przed rozpoczęciem zarządzać w języku C#.

Łatwo jest wywołać skrypt w języku C# i nie trzeba tworzyć skryptu jako pliku. Możesz po prostu wysłać tekst skryptu bezpośrednio i wywołać go.

może można nawet połączyć 2 podobny do:

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

Zauważ, że dodałem rurę po wyniki skryptów są zwracane. Pamiętaj, że "AddScript" jest bardzo podobny do wysyłania paczki tekstu do powershell.exe. Pchnąłem już całe pliki skryptów z zasobów osadzonych do tej metody.

1

Zastosowanie Linq:

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

następnie ustawić myDataGrid.ItemsSource = dynamicResults;