【问题标题】:How to display PSObject in C#如何在 C# 中显示 PSObject
【发布时间】:2021-05-04 19:48:43
【问题描述】:

我正在使用 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 是一个字符串,结果不是我想要的。它将显示“长度:40”,而不是字符串本身。

还有一个问题:如果我执行多个 PowerShell 命令,为什么会显示所有结果,包括之前的结果。比如我执行“ls;get-process”,它会显示“ls”的结果和“get-process”的结果。

【问题讨论】:

  • 这个"ls; get-process" 看起来像是在告诉 PowerShell 在同一个管道中执行两个命令。它将这样做并返回两个结果。它在控制台中也是如此。

标签: c# powershell


【解决方案1】:

我认为我们需要查看更多您的代码。显示返回的 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);
    }
}

【讨论】:

  • 我想将结果显示为以下格式:key:value,但是如果psobject是字符串,它会显示:“Length:100”,我想要的是字符串本身。
  • 例如,如果我输入“get-process”,我想要显示“Handles:83, NPM:23, PM:21, WS:1234, VM​​: 280, CPU: 12, ID:12, Process-Name: conhost" 像这样,一行一行。如果结果是字符串或整数,我想显示它。例如,如果我输入“$list.count”,它将显示一个数字。
  • 如果psobject是其他类型怎么处理?
  • 您使用is 测试您想要处理格式的每种类型。对于字符串、日期时间、布尔值、数字等,您可以直接进入最后的 else 子句,该子句隐式使用 ToString() 向对象询问其字符串表示形式。
  • 对于一个pshost,我不知道psobject是什么类型,有什么方法可以得到psobject的类型吗?
【解决方案2】:

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

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

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

Console.WriteLine(toConsole);

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2019-02-07
    • 2021-09-24
    • 2017-05-08
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多