我有一個呼叫 sqlcmd 的 PowerShell 腳本。回傳后,它似乎禁用了 PowerShell (v7.2.0) 中的所有顏色輸出,并且我在視窗中獲得了 ANSI 轉義序列輸出(例如[33;1m)我嘗試呼叫[Console]::ResetColor()但似乎沒有這樣做任何事物。
任何想法如何告訴 Powershell 開始解釋顏色轉義序列而不是在控制臺中列印額外的垃圾?
示例重現問題:
Write-Warning "hello world"
$process = Start-Process sqlcmd -ArgumentList @('-Q',"`"$($Command)`"") -PassThru -NoNewWindow -Wait
Write-Warning "hello again"

uj5u.com熱心網友回復:
感謝@Jeroen 提供面包屑。
基于此,我有以下解決方案:
foo.ps1:
.".\Reset-ConsoleColors.ps1"
Write-Warning "hello world"
$process = Start-Process sqlcmd -ArgumentList @('-Q',"`"$($Command)`"") -PassThru -NoNewWindow -Wait
Reset-ConsoleColors
Write-Warning "hello again"
重置-ConsoleColors.ps1:
function Reset-ConsoleColors {
$MethodDefinitions = @'
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint lpMode);
'@
$Kernel32 = Add-Type -MemberDefinition $MethodDefinitions -Name 'Kernel32' -Namespace 'Win32' -PassThru
$hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE
$mode = 7
$Kernel32::SetConsoleMode($hConsoleHandle, $mode) | out-null
}

仍然不知道為什么 sqlcmd 正在更改控制臺模式或如何告訴它不要更改,但是現在控制臺輸出在我呼叫它之后并沒有變得瘋狂。
uj5u.com熱心網友回復:
雖然這個癥狀很有趣,但您的反饋告訴我們這個問題很容易避免,這樣做不僅僅是一種解決方法,它實際上是在當前視窗中同步運行控制臺應用程式的最佳方法:
而不是Start-Process:
$process = Start-Process sqlcmd -ArgumentList @('-Q',"`"$($Command)`"") -PassThru -NoNewWindow -Wait
使用直接呼叫:
$output = sqlcmd -Q $Command
根據您的反饋,這使問題消失(虛擬終端/ANSI 轉義序列的解釋繼續有效)。
除了在當前視窗同步運行,直接呼叫:
將外部程式的標準輸出流連接到 PowerShell 的流,允許您捕獲 stdout 輸出,如上所示,并重定向 stderr 輸出(使用
2>)在自動變數中反映外部程式(行程)的退出代碼
$LastExitCode
只有在不尋常的情況下才是Start-Process呼叫控制臺應用程式的正確工具,例如想要在新視窗中運行(沒有 -NoNewWindow) - 請參閱此答案。GitHub 檔案問題 #6239提供了關于何時使用 Start-Processis 和不合適的指導。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399963.html
標籤:电源外壳
