在 Microsoft PowerShell 中提示提取

问题描述 投票:0回答:1

有一个函数:$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([93mmain[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([93mmain[94m)[0m            [38;2;254;209;66m 3.9.13[0m[92m 00:22:32 [0m
[92m➜ [0m
(.venv) 
powershell terminal command-prompt windows-terminal
1个回答
0
投票

我预计一开始它将包含与绿色文本“(.venv)”相对应的 ANSI 序列

  • >
    重定向运算符,仅作用于成功输出流,其(隐含)编号为
    1

  • 相比之下,

    Write-Host
    (尽管有它的名字)写入information输出流(其编号为
    6
    ),因此默认情况下
    >
    捕获。


虽然您可以使用

*>&1
将所有(其他)流 (
*
) 重定向到成功输出流 (
1
),但由
Write-Host
发出的任何 ANSI 转义序列在此过程中仍然会丢失

© www.soinside.com 2019 - 2024. All rights reserved.