【问题标题】:Does powershell have an equivalent to popen?powershell 是否具有与 popen 等效的功能?
【发布时间】:2008-10-22 22:12:04
【问题描述】:

我需要能够启动一个进程并将输出读入一个变量。然后根据命令的返回,我可以选择显示完整输出或仅显示选定的子集。

为了清楚起见,我想启动一个基于文本的进程(实际上是 psexec)并将该命令(stdout、stderr 等)的输出读取到变量中,而不是将其直接输出到控制台。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    你遗漏了一些关于什么样的进程的细节,但我认为 Powershell 团队博客中的 this article 有你想做的任何事情,无论是在某处管道传输可执行文件的输出,还是利用 System.Diagnostics.Process

    既然第二个选项听起来像是您想要做的,您可以使用ProcessStartInfo 类来输入true 作为RedirectStandardOutput 属性,然后从StandardOutput 属性中读取@987654327 @object 对输出做任何你想做的事情。 StandardError 工作原理相同。

    【讨论】:

    • 不确定你想要它更清晰。我想从powershell启动的命令中捕获输出......比如popen。该页面似乎只列出了启动流程的方法。
    • 对,该示例涵盖了启动可执行文件。利用 ProcessStartInfo 类,特别是 RedirectStandardOutput 属性来捕获您想要的内容。
    • 是的,只是同时想通了。在 powershell 中从流中读取数据的任何提示?
    • 不多,但我预计您将来会大量使用“new-object”和 System.IO 命名空间。 :)
    • 嗯,实际上看起来很简单,只是流上的 ReadToend() 方法。
    【解决方案2】:

    就将内容读入变量而言,您应该能够执行类似的操作

    $output = ps
    

    不过,这只会捕获标准输出,不会捕获详细、警告或错误流。通过测试特殊变量$?可以得到上一条命令的退出码。

    我认为更多信息将有助于提供更完整的答案,但希望这对您正在寻找的内容有所帮助。

    【讨论】:

      【解决方案3】:

      PowerShell Community Extensions 包括 Start-Process。这实际上返回一个 System.Diagnostics.Process

      > $proc = Start-Process pslist -NoShellExecute
      

      但是,虽然这会返回 Process 对象,但它不允许您在执行之前重定向输出。为此,可以创建自己的流程并通过首先修改 ProcessStartInfo 成员来执行它:

      > $proc = New-Object System.Diagnostics.Process
      > $proc.StartInfo = New-Object System.Diagnostics.ProcessStartInfo("pslist.exe")
      > $proc.StartInfo.CreateNoWindow = $true
      > $proc.StartInfo.UseShellExecute = $false
      > $proc.StartInfo.RedirectStandardOutput = $true
      > $proc.Start()
      > $proc.StandardOutput.ReadToEnd()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多