2016-12-23 3 views
5

Я написал сценарий Powershell, который читает CSV-файл и возвращает предопределенную коллекцию из данных. Ниже приведен пример вывода сценария.Возврат Powershell PSObject как DataTable в C#

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

Я смог получить результаты в C#, сохраняя его в PSObject так:

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

Теперь, когда я ожидал один объект, я могу получить все значения и назначьте их следующим переменным:

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

Однако у меня возникли проблемы с преобразованием этого решения в динамическое. То есть ожидается, что количество строк будет меняться. Поэтому я реализовал это раньше, когда исходный код является базой данных SQL с использованием решения, аналогичного тому, которое было опубликовано here, поэтому я предположил, что данные должны быть способными, но я не могу заставить его работать в этом сценарии. Любые идеи или предложения? Благодаря!

Примечание: Компонент сценария Powershell здесь является обязательным, так как он включает в себя другие механизмы для формулировки вывода, поэтому, хотя я мог просто читать из файла CSV с помощью C#, это просто не вариант.

+0

Какая у вас проблема? Из того, что я понял, вы повторяете все результаты и получаете доступ к своим свойствам без каких-либо проблем, так какая же проблема, вызванная переменным числом строк? –

+0

Привет, Лукас, я могу только получить значения, если знаю, сколько строк есть. (массив ссылается аналогично 'array [0]' или 'array [1]). Я пытаюсь создать функцию, которая может хранить все результаты в datatable.Надеюсь, что это очистит. – Yad

+0

Когда вы выполняете итерацию с помощью инструкции foreach, вам не нужно ссылаться на массив. И даже если вы это сделаете, вы можете использовать оператор for для i

ответ

1

Что я понял из вашего вопроса, так это то, что вы хотите иметь DataTable для дальнейшего процесса обработки данных и хотите использовать его в своей соответствующей коллекции.

Вы можете продолжить так:

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

Надеется, что это полезно для вас.

Documentations присутствуют: Doc 1 и Doc 2

1

, так как вы уже используете PowerShell для чтения файла CSV, почему бы не продолжить?

Вы можете вызвать команду/скрипт powershell для повторения результатов вашего * .ps1 файла, прежде чем вы начнете управлять им на C#.

Очень легко вызвать скрипт в C#, и вам не нужно создавать скрипт в виде файла. Вы можете просто отправить текст сценария напрямую и вызвать его.

может быть, вы даже можете объединить 2 похожие на: что я добавил трубку после того, как ваши результаты сценария возвращается

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

Уведомления. Помните, что «AddScript» очень похож на отправку кучи текста в файл powershell.exe. Я до сих пор выталкивал целые файлы сценариев из встроенных ресурсов.

1

Использование Linq:

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

Затем установите myDataGrid.ItemsSource = dynamicResults;

Смежные вопросы