Как преобразовать 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)