有没有办法从PowerShell中的可执行文件中捕获STDOUT信息,而不会影响STDOUT进程的默认行为?每当我尝试从PowerShell中的可执行文件中捕获输出时,似乎在返回到主机/屏幕之前格式化STDOUT。此外,当要求捕获stdout输出时,PowerShell似乎也会逐行将数据提供给主机,只有在输出中找到换行符/回车符后才返回一行数据。
基本上,我希望有一种方法可以从PowerShell中的可执行文件中捕获STDOUT数据,而不会以任何方式更改STDOUT输出或操作。有谁知道目前这是否可行?
我已经阅读过,我知道,Start-Transcript / Stop-Transcript cmdlet的局限性。如果能够为我抓住这个输出,我的问题就解决了。
提前感谢任何可以提供帮助的人。
-M
答案 0 :(得分:1)
一个简单的小C#程序显示PowerShell不会等待行终止符将输出写入stdout。编译并运行它:
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世界的每个字符!每500毫秒出现在屏幕上。输出在写入行结束符之前出现。根据与PowerShell团队的对话,我的理解是,在没有重定向的情况下运行时,控制台应用程序获得控制台句柄,以便他们可以直接写入绕过PowerShell和任何PowerShell格式的stdout。这样做是为了允许某些控制台应用程序(如edit.com)将彩色输出写入屏幕。
您看到奇怪的输出行为的EXE是什么?您是否有可能看到控制台缓冲的影响?在CMD.exe下运行时,EXE输出是否表现更好?
答案 1 :(得分:0)
我不知道tee-object会对你有帮助吗?
这是转移输出的一种方法,但我不知道它是否解决了您的问题。