Существует функция: $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
Но я ожидал, что вначале он будет содержать последовательность ANSI, соответствующую зеленому тексту "(.venv)".
Как мы можем обрабатывать прямую запись в консоль и поддерживать устаревшие подсказки?
Я попытался захватить вывод консоли:
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)
Я ожидал, что вначале он будет содержать последовательность ANSI, соответствующую зеленому тексту "(.venv)"
>
, оператор перенаправления , действует только на успешный выходной поток, чей (подразумеваемый) номер равен 1
.
Напротив, Write-Host (несмотря на свое название) записывает в поток вывода информации (номер которого равен 6
), и поэтому по умолчанию не захватывается >
.
Хотя вы можете использовать *>&1
для перенаправления всех (других) потоков (*
) в поток успешного вывода (1
), любые (гипотетические) escape-последовательности ANSI, созданные Write-Host
, все равно теряются в процессе.
В PowerShell (Core) 7 даже (временно) установка свойства .OutputRendering
привилегированной переменной $PSStyle на 'Ansi'
не помогает, начиная с PowerShell 7.4.1.
В выпуске GitHub № 20171 это поведение обсуждается в контексте Out-String
и вывода CLI.
Write-Host
записывает непосредственно в буфер экрана — вам нужно объединить его с фактической строкой приглашения, возвращаемой функцией приглашения