如何在C#中显示PSObject

时间:2014-09-10 03:10:53

标签: c# powershell

我正在用C#构建一个powershell主机,我想在调用powershell后显示结果。现在我使用以下方法:

public static string GetLogQueriedString(PSMemberInfoCollection<PSPropertyInfo> PSPropertyCollection)
    {
        string line = string.Empty;
        foreach (var item in PSPropertyCollection)
        {
            if (!line.Equals(string.Empty)) line += ",";
            line += item.Name + " : " + item.Value;
        }

        return line;
    }

如果psobject有许多我需要的属性,它会起作用,但在这种情况下,如果PSObject是一个字符串,结果不是我想要的,它将显示“Length:40”,而不是字符串本身。

和另一个问题,如果我执行几个powershell命令,为什么它会显示所有结果,包括前一个结果,例如,我执行“ls; get-process”它将显示“ls”的结果和结果“获得处理”

2 个答案:

答案 0 :(得分:4)

我认为我们需要查看更多代码。显示返回的PSObject的典型方法是:

using (var ps = PowerShell.Create()) {
    while (true) {
        Console.WriteLine("Enter an expression:");
        string input = Console.ReadLine();
        if (String.IsNullOrWhiteSpace(input)) break;

        ps.AddScript(input);
        Collection<PSObject> results = ps.Invoke();
        foreach (var result in results) {
            Console.WriteLine(result);
        }
    }
}

如果您不需要访问返回对象的属性,而您感兴趣的是格式化文本,请尝试更改此行:

ps.AddScript(input + " | Out-String");

如果您想根据对象类型进行自定义格式设置,则需要根据需要测试类型和格式:

foreach (var result in results) {
    var baseObj = result.BaseObject;
    if (baseObj is System.Diagnostics.Process)
    {
        var p = (System.Diagnostics.Process) baseObj;
        Console.WriteLine("Handles:{0}, NPM:{1}, PM:{2}, etc", p.HandleCount, p.NonpagedSystemMemorySize, p.PagedMemorySize);
    }
    else {
        Console.WriteLine(result);
    }
}

答案 1 :(得分:0)

需要更多代码,但只是对先前答案的澄清.... 将 PSObject LIKE 视为一个数组可能会有所帮助,因为每个值都是一个键值对。因此,如果您尝试显式地强制转换为 ToString,您将获得对象类型,就像您尝试将数组转换为字符串一样,您将获得内存引用。

一个简单的解决方案是使用 foreach。对于您的代码:

foreach(var r in results) {
  string toConsole = r.ToString()
}

Console.WriteLine(toConsole);