如何在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
相关产品推荐
相关产品推荐

