PowerShell STDOUT格式问题

问题描述:

是否有方法从powershell内的可执行文件捕获STDOUT信息,而不影响STDOUT过程的默认行为?每当我尝试在PowerShell中捕获可执行文件的输出时,看起来STDOUT在返回到主机/屏幕之前都会被格式化。此外,似乎PowerShell在被要求捕获stdout输出时,会将数据逐行馈送到主机,只有在输出中发现换行符/回车中断时才返回一行数据。PowerShell STDOUT格式问题

基本上,我想有一种方法可以从powershell内运行的可执行文件中捕获STDOUT数据,而无需以任何方式更改STDOUT输出或操作。有谁知道这是否可能?

我已经阅读并了解了Start-Transcript/Stop-Transcript cmdlet的局限性。如果这能够为我获得这个输出,我的问题就会被解决。

在此先感谢任何人,可以在这里协助。

-M

我不知道是否tee-object会帮助你?

这是一种转移输出的方法,但我不知道它是否能解决您的疑虑。

+0

T恤对象很不错,但我确实注意到无法附加到使用它的文件,因此您需要解决该限制。 – 2009-11-20 10:00:15

+0

我已经尝试了T恤对象;这显示了我的原始帖子中列出的相同症状。 – 2009-11-20 13:40:11

一个简单的小C#程序显示PowerShell不会等待行结束符将输出写入标准输出。编译并运行它:

using System; 
using System.Threading; 

class App 
{ 
    static void Main(string[] args) 
    { 
     string str = "Hello world!"; 
     Array.ForEach(str.ToCharArray(), 
         ch => { Console.Write(ch);Thread.Sleep(500); }); 
     Console.WriteLine(); 
     Console.Write("Line start "); 
     Thread.Sleep(2000); 
     Console.WriteLine(" line term."); 
    } 
} 

此EXE显示Hello World的每个字符!每500毫秒出现在屏幕上。输出出现在行结束符写入之前。基于与PowerShell团队的对话,我的理解是,控制台应用程序在没有重定向的情况下运行时,会获得控制台句柄,以便他们可以直接写入标准输出,绕过PowerShell和任何PowerShell格式。这样做是为了允许某些控制台应用程序(如edit.com)将彩色输出写入屏幕。

什么是EXE你看到奇怪的输出行为?是否有可能看到控制台缓冲的影响?在CMD.exe下运行时,EXE输出表现更好吗?

+0

在字符串变量中回应值与我所做的不一样。我正在运行Exchange 2007可执行文件,并尝试在执行时从命令中捕获输出,而不会影响STDOUT功能/显示的默认行为。 – 2009-11-20 13:39:32

+0

您正在使用的Exchange Server 2007 exe文件的某处,它会像您说的那样“回显”,将字节转换为在PowerShell控制台上显示为文本的stdout。上面的代码编译为一个EXE,并显示PowerShell不会等待一行字。也许你可以详细阐述你看到的是什么。例如,你说你“试图捕获输出” - 你的意思是你正在使用文件重定向,例如foo.exe> foo.txt?如果是这样,那么你不应该在主机/屏幕上看到标准输出。 – 2009-11-20 15:11:08

+0

如果您在这种情况下看到输出,则可能是输出错误。 – 2009-11-20 15:12:04