有一个函数:$function:Global:Prompt,它将当前提示发送到输出控制台并通过管道传输其 ansi 序列。但是,在某些情况下它不起作用。
示例:
$function:Global:Prompt
=
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
_OLD_VIRTUAL_PROMPT
就我而言,它打印到终端:
(.venv) ~/projects/test-project/untitled :: git(main) 3.9.13 00:11:51
但是,它不会将“(.venv)”通过管道传输到输出。
$function:Global:Prompt.Invoke() > output.txt
退货
[36m[0m[36m ~/projects/test-project/untitled [0m[93m:: [94mgit([93mmain[94m)[0m [38;2;254;209;66m 3.9.13[0m[92m 00:13:59 [0m
[92m➜ [0m
但我预计一开始它会包含与绿色文本“(.venv)”相对应的 ANSI 序列。
我们如何处理直接写入控制台并支持遗留提示?
我尝试捕获控制台的输出:
function MyCaptureOutput {
param (
[scriptblock]$ScriptBlock
)
$outputBuffer = New-Object System.Text.StringBuilder
$stringWriter = New-Object System.IO.StringWriter -ArgumentList $outputBuffer
$originalOutStream = [Console]::Out
[Console]::SetOut($stringWriter)
$ScriptBlock.Invoke()
[Console]::SetOut($originalOutStream)
return $outputBuffer.ToString()
}
MyCaptureOutput -ScriptBlock {
$function:Global:Prompt.Invoke()
}
但它返回:
[36m[0m[36m ~/projects/test-project/untitled [0m[93m:: [94mgit([93mmain[94m)[0m [38;2;254;209;66m 3.9.13[0m[92m 00:22:32 [0m
[92m➜ [0m
(.venv)
我预计一开始它将包含与绿色文本“(.venv)”相对应的 ANSI 序列
>
,重定向运算符,仅作用于成功输出流,其(隐含)编号为1
。
Write-Host
(尽管有它的名字)写入information输出流(其编号为6
),因此默认情况下不被>
捕获。
虽然您可以使用
*>&1
将所有(其他)流 (*
) 重定向到成功输出流 (1
),但由 Write-Host
发出的任何 ANSI 转义序列在此过程中仍然会丢失。