【发布时间】:2008-10-22 22:12:04
【问题描述】:
我需要能够启动一个进程并将输出读入一个变量。然后根据命令的返回,我可以选择显示完整输出或仅显示选定的子集。
为了清楚起见,我想启动一个基于文本的进程(实际上是 psexec)并将该命令(stdout、stderr 等)的输出读取到变量中,而不是将其直接输出到控制台。
【问题讨论】:
标签: powershell
我需要能够启动一个进程并将输出读入一个变量。然后根据命令的返回,我可以选择显示完整输出或仅显示选定的子集。
为了清楚起见,我想启动一个基于文本的进程(实际上是 psexec)并将该命令(stdout、stderr 等)的输出读取到变量中,而不是将其直接输出到控制台。
【问题讨论】:
标签: powershell
你遗漏了一些关于什么样的进程的细节,但我认为 Powershell 团队博客中的 this article 有你想做的任何事情,无论是在某处管道传输可执行文件的输出,还是利用 System.Diagnostics.Process。
既然第二个选项听起来像是您想要做的,您可以使用ProcessStartInfo 类来输入true 作为RedirectStandardOutput 属性,然后从StandardOutput 属性中读取@987654327 @object 对输出做任何你想做的事情。 StandardError 工作原理相同。
【讨论】:
就将内容读入变量而言,您应该能够执行类似的操作
$output = ps
不过,这只会捕获标准输出,不会捕获详细、警告或错误流。通过测试特殊变量$?可以得到上一条命令的退出码。
我认为更多信息将有助于提供更完整的答案,但希望这对您正在寻找的内容有所帮助。
【讨论】:
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()
【讨论】: