2014-12-20 41 views
1

我想在Windows上使用node.js寫入ANSI轉義序列到標準輸出,但它似乎不起作用。ANSI轉義序列不打印到Windows上的標準輸出

具體來說,我用的是ConEmu,它是support子集的ANSI代碼。我創建了應該重新命名當前控制檯選項卡中的測試文件:

process.stdout.write('\x1b]9;3;"abc"\x1b\x5c'); 

然而,當我運行它沒有任何反應。如果我運行node test > out.txt,則將正確的字節寫入輸出文件。

爲什麼轉義序列不起作用?

回答

5

當節點的標準輸出連接到非交互式接收器(即傳送或重定向到文件)時,寫入process.stdout的字節將按原樣寫入。因此,運行node test > out.txt會產生預期結果。

但是,當節點連接到Windows中的交互式終端時,它(通過libuv)實際上是parses all ANSI escape codes,因此它可以透明地模擬使用Windows API的unix TTY終端。這是因爲Windows控制檯不支持ANSI轉義序列,所以會使顏色和重新定位光標在Windows中工作。

未知和不受支持的序列被忽略。

因此,JS調用process.stdout.write()和內部調用WriteConsoleW()(其中節點實際輸出到終端)之間的任何無法識別的命令都會被丟棄。

這可以圍繞從用戶代碼由FD 1.

var rawStdout = new fs.SyncWriteStream(1, { autoClose: false }); 

rawStdout寫作ANSI轉義序列將被適當地發射到終端打開原始文件系統流被加工。

rawStdout.write('\x1b]9;3;"abc"\x1b\x5c'); 

(當然,這並沒有給Windows控制檯任何神奇的新的能力;它只會逐字打印的順序,看起來像垃圾必須實際地使用一些支持ANSI轉義碼類型的終端模擬器。 。)


爲了更好地實現自己特定的目標,我最後寫一個模塊— console-title —通過寫在UNIX上ANSI轉義序列改變控制檯的標題,並調用Windows下的appropriate native API。這使我可以在Windows的默認控制檯窗口和仿真器如ConEmu中更改標題。

+0

好奇;我想知道ConEmu如何使標準輸出看起來像一個控制檯窗口?這是一個不時出現的問題,例如http://stackoverflow.com/q/12534018/886887,並且沒有已知的解決方案。或者也許node.js使用非標準方法來決定stdout是否是交互式的?我得看看那個...... –

+0

因爲有一個真正的控制檯窗口。 ConEmu隱藏真正的Windows控制檯窗口並複製其輸出。轉到菜單>調試>實時控制檯以查看它。 – josh3736

相關問題