Как преобразовать PSObject в поток вывода или DataTable с помощью C# Powershell System.Management.Automation

Мне нужно преобразовать PowerShell PSObject в поток так же, как PowerShell. PowerShell также обеспечивает вывод стандартного потока в общем виде.

например $PSVersionTable выводит только 2 столбца (имя, значение), а не весь Hashtable. Итак, я хочу, чтобы каждый PSO-объект обрабатывался одинаково стандартным образом, как это делает PowerShell. Кроме того, я хочу преобразовать это в DataTable. Я знаю, что есть другие ссылки, иллюстрирующие эту проблему, но они работают со всеми свойствами PSObject. Каким-то образом PowerShell делает все это из коробки.

Нужно ли конвертировать PSObject в другой тип?

Примеры

Выводы скрипта PowerShell $PSVersionTable как

PSVersion      5.1.17134.228
PSEdition      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}

$host или же Get-Host выходы как

Get-WebApplication выходы

Имя Пул приложений Протоколы Физический путь                                                                                                                                                                                                                 
---- ---------------- --------- -------------                                                                                                                                                                                                                 
IisHostedServer DefaultAppPool http C: \ TestDirectory \ Src \ IisHostedServer  

Get-ChildItem -Path "C:\TestDirectory\TestSubDir\Studio":

Режим LastWriteTime Длина Имя
----                -------------         ------ ----
d-----       29.06.2018     11:54                TestFileDir
d-----       24.07.2018     16:37                TestSites
-a----       13.08.2018     11:53            343 TestXml.xml

Точно так же могут быть другие ссылки или пользовательские типы.

Я хочу получить эти выходные данные в C# таким же образом, и мне нужно показать их как String или DataTable. Есть ли какое-либо преобразование из PSObject в поток или что-то, что возвращает вышеуказанный вывод совершенно общим способом?

пока я имею дело со следующим методом в C#:

var outputCollection = new PSDataCollection<PSObject>();

outputCollection.DataAdded += OnOutputDataAdded;
powerShell.Invoke(null, outputCollection);

private void OnOutputDataAdded(object sender, DataAddedEventArgs e)
{
    var records = (PSDataCollection<PSObject>) sender;
    var data = records[e.Index];
    var outputTable = ConverToLogableDataStream(data);
}
private void ConverToLogableDataStream(PSObject)
{
    ...
    ...
}

0 ответов

Этот вопрос довольно старый, но взгляните на ConvertTo-Json и переведите его в таблицу данных или класс по вашему выбору оттуда (сработал для меня)

например. Powershell:Get-Host | ConvertTo-Json

C#:JsonConvert.DeserializeObject<Список <имя класса>> (PSObject)

Другие вопросы по тегам