You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将PowerShell多属性结果分别显示到对应TextBox中

解决方法:从PowerShell返回的PSObject中提取单个属性值

你当前代码里用了Out-String把结果转成纯文本,丢失了对象结构,没法单独提取属性。要把每个属性对应到TextBox,需要保留PowerShell返回的PSObject对象,直接访问它的属性成员。

修改后的代码示例:

using (PowerShell powerShell = PowerShell.Create())
{
    // 直接选择需要的属性,无需-expand或Out-String
    powerShell.AddScript("Get-ComputerInfo | Select-Object CsDNSHostName, WindowsProductName, OSVersion, CSDomainRole, CSProcessors, OsProductType");
    
    Collection<PSObject> PSOutput = powerShell.Invoke();
    
    // Get-ComputerInfo只返回一个对象,取集合第一个元素即可
    if (PSOutput.Count > 0)
    {
        PSObject computerInfo = PSOutput[0];
        
        // 提取单个属性值,用?.和??处理可能的null情况
        txtCsDNSHostName.Text = computerInfo.Properties["CsDNSHostName"]?.Value?.ToString() ?? "";
        txtWindowsProductName.Text = computerInfo.Properties["WindowsProductName"]?.Value?.ToString() ?? "";
        txtOSVersion.Text = computerInfo.Properties["OSVersion"]?.Value?.ToString() ?? "";
        
        // CSDomainRole是枚举值,转成可读名称
        if (computerInfo.Properties["CSDomainRole"]?.Value is int domainRole)
        {
            string roleName = domainRole switch
            {
                0 => "独立工作站",
                1 => "成员工作站",
                2 => "独立服务器",
                3 => "成员服务器",
                4 => "备份域控制器",
                5 => "主域控制器",
                _ => domainRole.ToString()
            };
            txtCSDomainRole.Text = roleName;
        }
        else
        {
            txtCSDomainRole.Text = "";
        }
        
        // CSProcessors是处理器对象集合,拼接成可读字符串
        if (computerInfo.Properties["CSProcessors"]?.Value is Collection<PSObject> processors)
        {
            StringBuilder procSb = new StringBuilder();
            foreach (var proc in processors)
            {
                string procName = proc.Properties["Name"]?.Value?.ToString() ?? "未知处理器";
                procSb.AppendLine(procName);
            }
            txtCSProcessors.Text = procSb.ToString().Trim();
        }
        else
        {
            txtCSProcessors.Text = "";
        }
        
        // OsProductType是枚举值,转成可读名称
        if (computerInfo.Properties["OsProductType"]?.Value is int productType)
        {
            string productTypeName = productType switch
            {
                1 => "工作站",
                2 => "域控制器",
                3 => "服务器",
                _ => productType.ToString()
            };
            txtOsProductType.Text = productTypeName;
        }
        else
        {
            txtOsProductType.Text = "";
        }
    }
}

关键说明:

  • 去掉Out-String才能保留PSObject的结构,方便直接读取属性。
  • 用?.和??处理属性为null的情况,避免空引用异常。
  • 对于CSDomainRole、OsProductType这类枚举属性,可映射为友好的文字描述,也可以直接转字符串输出原始数值。
  • CSProcessors是集合类型,需要遍历内部对象提取具体属性(比如处理器名称)。
  • 后续切换到Get-AdComputer时,只需修改PowerShell脚本(比如Get-AdComputer -Identity "目标计算机" -Properties DNSHostName, OperatingSystem, ...),并调整属性名(比如CsDNSHostName对应DNSHostName),提取属性的逻辑完全通用。

内容的提问来源于stack exchange,提问作者angelman26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:24:51