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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:09