如何在 C# 中显示 PSObject

fro*_*ake 4 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;
}
Run Code Online (Sandbox Code Playgroud)

如果 PSObject 有许多我需要的属性,它就可以工作,但在这种情况下,如果 PSObject 是一个字符串,则结果不是我想要的。它将显示“长度:40”,而不是字符串本身。

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

Kei*_*ill 5

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

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

ps.AddScript(input + " | Out-String");
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)