2009-11-19 92 views
0

是否有方法從powershell內的可執行文件捕獲STDOUT信息,而不影響STDOUT過程的默認行爲?每當我嘗試在PowerShell中捕獲可執行文件的輸出時,看起來STDOUT在返回到主機/屏幕之前都會被格式化。此外,似乎PowerShell在被要求捕獲stdout輸出時,會將數據逐行饋送到主機,只有在輸出中發現換行符/回車中斷時才返回一行數據。PowerShell STDOUT格式問題

基本上,我想有一種方法可以從powershell內運行的可執行文件中捕獲STDOUT數據,而無需以任何方式更改STDOUT輸出或操作。有誰知道這是否可能?

我已經閱讀並瞭解了Start-Transcript/Stop-Transcript cmdlet的侷限性。如果這能夠爲我獲得這個輸出,我的問題就會被解決。

在此先感謝任何人,可以在這裏協助。

-M

回答

0

我不知道是否tee-object會幫助你?

這是一種轉移輸出的方法,但我不知道它是否能解決您的疑慮。

+0

T恤對象很不錯,但我確實注意到無法附加到使用它的文件,因此您需要解決該限制。 – 2009-11-20 10:00:15

+0

我已經嘗試了T恤對象;這顯示了我的原始帖子中列出的相同症狀。 – 2009-11-20 13:40:11

1

一個簡單的小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