如何从C#中的powershell类捕获完全调用文本

问题描述 投票:1回答:3

我想在PowerShell中运行命令时完全捕获所得到的输出。

例如,当我输入LS时,我得到:

enter image description here

但是,当我使用此代码时:

        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();

        PowerShell ps = PowerShell.Create(); // Create a new PowerShell instance
        ps.Runspace = runspace; // Add the instance to the runspace
        ps.Commands.AddScript("ls"); // Add a script

        Collection<PSObject> results = ps.Invoke();

        runspace.Close();


        StringBuilder stringBuilder = new StringBuilder();
        foreach (PSObject obj in results)
        {
            Console.WriteLine(obj.ToString());
        }

我得到以下输出:

Microsoft.Management.Infrastructure.dll
System.Management.Automation.dll
System.Management.Automation.xml
WpfApp1.exe
WpfApp1.exe.config
WpfApp1.pdb

尽管此输出可能会派上用场,但在其他应用程序中,我没有得到正确的输出作为回报,因此,我希望使用在PowerShell本身中看到的确切输出。

在PowerShell中,一行一行一行地读取输出信息?

c# powershell output runspace
3个回答
1
投票

您可以通过访问PropertiesPSObject来读取值。

foreach (PSObject obj in results)
{
    var name = obj.Properties["Name"]?.Value.ToString()
    var mode = obj.Properties["Mode"]?.Value.ToString();
    var length = obj.Properties["Length"]?.Value.ToString();
    var lastMod = (DateTime?)obj.Properties["LastWriteTime"]?.Value;

    Console.WriteLine(string.Format("{0} {1} {2} {3}", mode, lastMod, length, name));
}

如果您想获得Powershell产生的确切文本,则可以在powershell命令中使用Out-String

Out-String

ps.Commands.AddScript("ls | Out-String");


0
投票

您可以使用此命令从powershell获取压缩的json输出

enter image description here

然后反序列化。此外,此命令提供的信息比Powershell输出中提供的信息更多。


0
投票

注:此答案还建议ls | ConvertTo-Json -Compress 的哪个部分以更集中的方式显示并带有补充信息。

修改您的脚本以通过管道传递到haldo's helpful answercmdlet,它使用PowerShell的格式系统将其呈现为字符串,就像将其输出到控制台一样。

Out-String

一些助手:

  • 出于鲁棒性,我建议避免在脚本和已编译的代码中使用别名(例如Out-Stringps.AddScript("ls | Out-String"); // Add a script )。在当前情况下,ls在类Unix平台上不起作用,因为未在其中定义别名,以免与平台本机Get-ChildItem实用程序发生冲突。

  • 最好将ls包裹在ls块中,以确保处理掉PowerShell实例:PowerShell ps = PowerShell.Create();

  • 通常不需要显式创建一个运行空间-using将为您创建一个运行空间。

  • using (PowerShell ps = PowerShell.Create()) { ... }返回的PowerShell.Create()实例直接公开诸如System.Management.Automation.PowerShell的方法-无需使用System.Management.Automation.PowerShell属性。

© www.soinside.com 2019 - 2024. All rights reserved.