我CreateProcess(win32) powershell并從中讀取原始位元組。
而且我看到它產生了很多看不見的字符。
例如u{1b}[2Ju{1b}[mu{1b}[
有什么方法可以阻止它嗎?
*確切地說,有可能手動剝離它們,但我希望有其他方法。
uj5u.com熱心網友回復:
你提到
powershell(powershell.exe),即Windows PowerShell的CLI。Windows PowerShell(與PowerShell(Core)7 不同,見下文)本身不使用基于VT/ANSI轉義序列的著色/格式化。
這意味著第三方代碼在你的情況下產生了VT序列,所以你必須停用(或重新配置)它以避免在輸出中出現這種序列。
一個主要的候選者是一個自定義的
prompt函式;這樣的函式通常涉及著色以獲得更好的命令列體驗。在
powershell.exe的程式化使用中,你只能看到提示函式列印的內容如果你將PowerShell命令送入CLI的stdin,同時將引數-File -傳遞給CLI(指示它從stdin讀取命令)或默認。要想從輸出中完全排除提示函式的輸出,請使用
-Command -,正如對你之前問題的回答中所討論的那樣。如果你確實需要它,但又想使用default提示字串,請使用
-NoProfile引數抑制$PROFILE加載,這在程式化處理中通常是比較好的。
在PowerShell (Core) 7.2 中控制使用彩色輸出(VT / ANSI轉義序列)
在PowerShell(Core)7 (pwsh.exe)中--但在Windows PowerShell(powershell.exe)中沒有--PowerShell本身情況下使用VT(ANSI)轉義序列來產生格式化/彩色的輸出,例如在Select-String
在PowerShell 7.2 中,你可以分類抑制這些,如下:
注意:分類禁用VT(ANSI)序列通常沒有必要,因為PowerShell 自動在輸出沒有發送到主機(顯示)時抑制它們;也就是說,$PSStyle.OutputRendering默認為Host【1】。
- 這相當于Unix實用程式(明智地)表現出的相同行為:默認情況下,著色只在列印到display(終端)時應用,而不是在管道到另一個命令或重定向到一個檔案時。
從外部PowerShell,在啟動它:
通過定義NO_COLOR環境變數,使用任何值,例如1。
這使得PowerShell在啟動時將
$PSStyle.OutputRendering設定為PlainText,這指示PowerShell不使用VT / ANSI轉義序列。越來越多的外部程式也尊重這個環境變數 - 參見no-color.org
另外,通過將TERM環境變數設定為xtermm / xterm-mono:
- 注意值
dumb,至少在PowerShell Core 7.2.0-preview.9中是這樣的 (的最新版本),不作業:雖然它確實導致$host.UI.SupportsVirtualTerminal然后反映$false,如檔案所述,$PSStyle. OutputRendering仍然是它的默認值,Host,并且實際的格式化輸出(例如從Get-Item /)仍然使用顏色。 - 然而,設定
TERM可能比NO_COLOR更有效,可以讓外部程式不發出VT序列--然而最終還是不能保證。 - 這就是說,修改
TERM,特別是將其設定為dumb值,在一般情況下最好避免。因為外部程式(在類似Unix的平臺上)可能依賴于TERM變數來推斷主機終端程式的能力(將變數設定為dumb就會完全消失,而且--至少是假設--值xtermm/xterm-mono可能會誤報真正的基本終端型別)。
從內部PowerShell:
- 隨著
$PSStyle.OutputRendering = 'PlainText'的到來 - 注意,僅此一項--與上面討論的環境變數不同--并不影響外部程式的行為 。
請注意,使用VT序列的第三方PowerShell代碼,尤其是在PowerShell(Core)7 之前的代碼,可能不尊重上述禁用它們的任何標準機制(盡管可以想象提供一個自定義機制)。
[1] 這適用于自 v7.2.0-preview.9 起,其中 uj5u.com熱心網友回復: 你可以通過設定環境變數
標籤: 上一篇:如何在python中把單元格資料分割成不同的單元格?
下一篇:控制面板小程式執行的命令列語法
Host 被作為默認值,而之前的默認值 Automatic 則被完全洗掉。
TERM為dumb來禁用ANSI輸出渲染: SetEnvironmentVariable(TEXT("TERM")。TEXT("dumb"))。)
//繼續與你的呼叫到 CreateProcess
