教程:在 Windows 终端中设置进度栏

Windows 终端支持 ConEmu“进度栏”序列(也称为“OSC 9;4”)。 这些序列允许命令行应用程序在终端窗口中显示进度栏。 这对于长时间运行的命令(例如复制大文件或部署应用程序的命令)非常有用。

在 Windows 终端中,进度栏显示在两个位置:

  • 在选项卡标题中,作为进度环
  • 在 Windows 任务栏中,以与下载进度栏相同的方式显示。

选项卡标题中进度环外观的一个示例

先决条件

  • Windows 终端 v1.6 或更高版本。
  • 对于任务栏动画,需要确保在“设置/轻松访问/显示”中启用“在 Windows 中显示动画”。

进度栏序列格式

若要设置进度栏,需要将 OSC 9;4 序列发送到终端。 该序列采用以下格式:


ESC ] 9 ; 4 ; <state> ; <progress> BEL

  • ESC 是转义字符 ASCII 27。
  • BEL 是响铃字符 ASCII 7。
  • <state>01234 中的一个。
    • 0 是默认状态,表示应隐藏进度栏。 在命令完成后使用此状态来清除任何进度状态。
    • 1:将进度值设置为 <progress>,处于“默认”状态。
    • 2:将进度值设置为 <progress>,处于“错误”状态。
    • 3:将任务栏设置为“不确定”状态。 这对于没有进度值但仍在运行的命令非常有用。 此状态忽略 <progress> 值。
    • 4:将进度值设置为 <progress>,处于“警告”状态。
  • <progress> 是 0 到 100 之间的数字(含 0 和 100)。

示例

PowerShell

# Set the progress bar to 50%
Write-Host -NoNewline ([char]27 + "]9;4;1;50" + [char]7)

也可使用 PowerShell 7:

# Set the progress bar to 50%
Write-Host -NoNewline ("`e]9;4;1;50`a")

Bash

# Set the progress bar to 50%
echo -ne "\033]9;4;1;50\a"

C#

// Set the progress bar to 50%
Console.Write("\x1b]9;4;1;50\x07");

命令提示符

命令提示符有点棘手,因为它对转义序列没有很好的支持。 可以使用 echo 命令发送转义序列,但需要在文件中使用原义 ESC 和 BEL 字符。 这些项可能在 Web 浏览器中呈现为框,但它们应该在终端中工作。

<NUL set /p =]9;4;1;50 
echo Started progress (normal, 50)

上面的示例使用 NUL 设备将转义序列写入控制台,不带换行符。

注意:没有在这里看到你喜欢的 shell? 如果你已清楚,可随意为你喜欢的 shell 提供一个解决方案!