【问题标题】:Returning PowerShell query to dropdown with separate names and values使用单独的名称和值将 PowerShell 查询返回到下拉列表
【发布时间】:2019-01-14 11:09:22
【问题描述】:

我正在创建一个 ASP.Net Web 应用程序,其中一部分使用 PowerShell 查询的结果填充下拉列表。这部分我可以做,但我最理想的是 PS 查询为每个对象返回两个属性,一个显示在下拉列表中,另一个作为值 if。

研究表明我可以使用DataTable 来做到这一点,但我在下面的努力不起作用。我没有在下拉列表中获取 DisplayName 值,而是得到两个属性名称(DisplayName 和 SipAddress)加上“长度”,对每个返回的结果重复。如果我检查列表中各种 DisplayName 和 SipAddress 项的值,它们包含正确的数据,但我希望 DisplayName 的值作为列表,而 SipAddress 的值作为相应的值。

DataTable dt = new DataTable();
dt.Columns.Add("DisplayName");
dt.Columns.Add("SipAddress");

var shell = PowerShell.Create();
shell.Commands.AddScript("Get-CsCommonAreaPhone | Select-Object DisplayName, SipAddress -ExpandProperty DisplayName | Sort-Object DisplayName");
var results = shell.Invoke();

foreach (var psObject in results)
{
    foreach (PSPropertyInfo prop in psObject.Properties)
    {
        var Name = prop.Name;
        var sip = prop.Value;
        dt.Rows.Add(Name, sip);
    }
}

capdroplist.DataSource = dt;
capdroplist.DataTextField = "DisplayName";
capdroplist.DataValueField = "SipAddress";
capdroplist.DataBind();

【问题讨论】:

  • 我想你想要:dt.Columns.Add("DisplayName",typeof(string)); dt.Columns.Add("长度",typeof(int));
  • does not work 请详细说明。
  • @jdweng 我只想要 DisplayName 和 SipAddress 这两个都是字符串,由于我对 DataTables 和与 Powershell 的交互的了解不足,所以会出现 Length。我必须声明类型吗?
  • @Reniuz 抱歉我不是很清楚,将编辑澄清
  • 问题不在于数据表。您的代码是 find 添加两个值。您不需要两个 for 循环。消除:foreach(psObject.Properties 中的 PSPropertyInfo 道具)。看起来结果的每一行都是一个 psObject,其中包含一个 Name 属性和一个 Value。所以你想要 dt.Rows.Add(new object[] {psObject.Properties[0].Value, psObject.Properties[1].Value});

标签: c# asp.net powershell


【解决方案1】:

非常感谢@jdweng,因为这是他的回答(稍作修改),但由于它在 cmets 中,我似乎无法将其标记为这样。工作代码如下。

DataTable dt = new DataTable();
            dt.Columns.Add("DisplayName");
            dt.Columns.Add("SipAddress");

            var shell = PowerShell.Create();
            shell.Commands.AddScript("Get-CsCommonAreaPhone -filter {DisplayName -like '*vdiv*'} | Select-Object DisplayName, SipAddress | Sort-Object DisplayName");
            var results = shell.Invoke();

            foreach (var psObject in results)
            {

                dt.Rows.Add(new object[] {psObject.Members["DisplayName"].Value,psObject.Members["SipAddress"].Value});

            }

            capdroplist.DataSource = dt;
            capdroplist.DataTextField = "DisplayName";
            capdroplist.DataValueField = "SipAddress";
            capdroplist.DataBind();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2014-03-17
    • 2019-11-14
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多