Прошло много времени с тех пор, как я баловался с WebForms, но я нашел способ сделать то, что вам нужно ...
Прежде всего, давайте немного изменим ваш скрипт PowerShell. Вместо того, чтобы возвращать строку (что делает | out-string
), мы можем просто вернуть объекты. Метод shell.Invoke()
в коде C# знает, как извлечь полноценные объекты из выходных данных сценария, поэтому нам не нужно сериализовать строку в сценарии PowerShell, а затем попытаться снова десериализовать ее обратно в объекты. внутри нашего C# кода.
Не обращая внимания на логику вашей бизнес-сферы c на минуту, мой скрипт просто возвращает массив PSCustomObjects и выглядит так:
MyScript.ps1
write-output @(
(new-object PSCustomObject -Property ([ordered] @{
"MyProperty1" = "MyValue1.1"
"MyProperty2" = "MyValue2.1"
"MyProperty3" = "MyValue3.1"
})),
(new-object PSCustomObject -Property ([ordered] @{
"MyProperty1" = "MyValue1.2"
"MyProperty2" = "MyValue2.2"
"MyProperty3" = "MyValue3.2"
}))
);
Теперь мой метод C# Page_Load делает это:
Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
// Initialize PowerShell engine
var powershell = PowerShell.Create();
// Add the script to the PowerShell object
var script = "c:\\temp\\MyScript.ps1";
powershell.Commands.AddCommand(script);
// Execute the script
var results = powershell.Invoke();
...
и results
содержит System.Collections.ObjectModel.Collection<PSObject>
. Мы не можем связать это напрямую с GridView, потому что свойства спрятаны в парах ключ-значение в Properties
элементе каждого PSObject
, но если мы создадим новый класс, довольно легко извлечь значения в нечто, что мы может привязка данных:
MyClass.cs
public class MyClass
{
public string MyProperty1 { get; set; }
public string MyProperty2 { get; set; }
public string MyProperty3 { get; set; }
}
и наш Page_Load может преобразовывать объекты PSObject в экземпляры этого класса:
Default.aspx.cs
...
var objects = results.Select(
r => new MyClass
{
MyProperty1 = (string)r.Properties["MyProperty1"].Value,
MyProperty2 = (string)r.Properties["MyProperty2"].Value,
MyProperty3 = (string)r.Properties["MyProperty3"].Value,
}
);
this.ResultGrid.DataSource = objects;
this.ResultGrid.DataBind();
}
Затем для отображения данных вам просто необходим GridView, добавленный в ваш Default.aspx с любыми столбцами и форматированием, которые вы хотите определить:
Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<div>
<h1>PowerShell Harness<asp:Label ID="Label1" runat="server" Text="Label" Visible="False"></asp:Label></h1>
<asp:GridView ID="ResultGrid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="MyProperty1" HeaderText="My Property 1" />
<asp:BoundField DataField="MyProperty2" HeaderText="My Property 2" />
<asp:BoundField DataField="MyProperty3" HeaderText="My Property 3" />
</Columns>
</asp:GridView>
</div>
</asp:Content>
Запустите это, и вы должны увидеть что-то подобное на странице:
Примечание
Возможно, ваш командлет Get-BrokerSession
возвращает коллекцию объекта определенного типа c уже, а не PSCustomObject, и в этом случае вы могли бы пропустите шаг преобразования и привязайте данные непосредственно к объекту results
, чтобы вы возможно, придется поиграть с этим, чтобы увидеть. Надеюсь, что приведенное выше даст вам несколько советов, если есть какие-либо различия.
Надеюсь, это поможет.