如何将PowerShell远程磁盘查询结果转换为C#对象?
解决PowerShell返回对象转自定义C#对象的问题
问题背景
需要获取远程磁盘可用空间信息,通过C#调用PowerShell执行Invoke-Command和Get-PSDrive拿到了PSObject类型的结果,现在要将其转换为自定义的MyCSharpObject类型。
自定义C#对象定义:
class MyCSharpObject { public string Name { get; set; } public string Used { get; set; } public string Free { get; set; } }
当前PowerShell执行后返回的PSObject,其ToString()结果格式为:
"@{PSComputerName=Server1; Used=130904309760; Free=136322117632}"
解决方案1:直接访问PSObject的属性集合
PSObject内部的属性都存储在Properties集合中,可以直接通过属性名取值,然后赋值给自定义对象:
修改原C#代码中的循环部分:
foreach (var outputObject in result) { var myObj = new MyCSharpObject(); // 映射PSComputerName到Name属性 myObj.Name = outputObject.Properties["PSComputerName"].Value?.ToString(); // 获取Used和Free并转为字符串 myObj.Used = outputObject.Properties["Used"].Value?.ToString(); myObj.Free = outputObject.Properties["Free"].Value?.ToString(); // 后续可对myObj进行业务处理 Console.WriteLine($"服务器:{myObj.Name},已用空间:{myObj.Used},可用空间:{myObj.Free}"); }
解决方案2:通过JSON序列化转换
如果需要更灵活的对象映射,可以先将PSObject序列化为JSON字符串,再反序列化为自定义对象。这种方法适合属性较多的场景,还可以通过修改PowerShell脚本调整输出属性名,让映射更直接:
步骤1:修改PowerShell脚本,调整输出属性名
将PSComputerName重命名为Name,和自定义对象的属性名对应:
Invoke-Command -ComputerName "Server1" {Get-PSDrive C} | Select-Object @{Name='Name';Expression={$_.PSComputerName}},Used,Free
步骤2:在C#中使用JSON序列化(需引入Newtonsoft.Json包)
// 先通过NuGet安装Newtonsoft.Json包 using Newtonsoft.Json; // 循环内的转换代码 foreach (var outputObject in result) { // 将PSObject转为JSON字符串 string json = JsonConvert.SerializeObject(outputObject); // 反序列化为自定义对象 MyCSharpObject myObj = JsonConvert.DeserializeObject<MyCSharpObject>(json); // 使用自定义对象 Console.WriteLine($"服务器:{myObj.Name},已用空间:{myObj.Used},可用空间:{myObj.Free}"); }
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

