當節點的標準輸出連接到非交互式接收器(即傳送或重定向到文件)時,寫入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中更改標題。
好奇;我想知道ConEmu如何使標準輸出看起來像一個控制檯窗口?這是一個不時出現的問題,例如http://stackoverflow.com/q/12534018/886887,並且沒有已知的解決方案。或者也許node.js使用非標準方法來決定stdout是否是交互式的?我得看看那個...... –
因爲有一個真正的控制檯窗口。 ConEmu隱藏真正的Windows控制檯窗口並複製其輸出。轉到菜單>調試>實時控制檯以查看它。 – josh3736