【问题标题】:Colorizing Windows command line output from PHP为 PHP 的 Windows 命令行输出着色
【发布时间】:2011-10-28 11:59:41
【问题描述】:

要在 bash 中输出彩色文本,请使用 ANSI escape sequences

如何在 Windows 命令行上输出彩色文本,特别是从 PHP 输出?

【问题讨论】:

  • 好问题!虽然我认为cmd.exe 根本无法做到这一点。
  • 啊,看来还是可以的。 stackoverflow.com/questions/77744/…
  • @Pekka 我也看到了这个,但它的价值似乎太多了。虽然出于好奇:mailsend-online.com/blog/…
  • 多年来我一直在想同样的事情。普通的 ANSI 转义码过去在 Windows 95/98 中可以正常工作,但在 NT/2000 中从未出现过。
  • 我是 DOS 6.22 的旧时代,您需要加载 ANSI.SYS en.wikipedia.org/wiki/ANSI.SYS 以在 DOS 提示符下启用 ASNI 转义码。

标签: php colors cmd


【解决方案1】:

http://www.script-coding.com/dynwrap95.zip下载 dynwrap.dll

然后将其解压到%systemroot%\system32目录,然后在命令行中运行以下命令:

regsvr32.exe "%systemroot%\system32\dynwrap.dll"

您将收到一条成功消息,这意味着 dynwrap.dll 已注册。

那么你可以这样使用它:

$com = new COM('DynamicWrapper');

// register needed features
$com->Register('kernel32.dll', 'GetStdHandle', 'i=h', 'f=s', 'r=l');
$com->Register('kernel32.dll', 'SetConsoleTextAttribute', 'i=hl', 'f=s', 'r=t');

// get console handle
$ch = $com->GetStdHandle(-11);

一些例子:

$com->SetConsoleTextAttribute($ch, 4);
echo 'This is a red text!';
$com->SetConsoleTextAttribute($ch, 7);
echo 'Back to normal color!';

颜色代码:
7 => 默认
0 => 黑色
1 => 蓝色
2 => 绿色
3 => 水色
4 => 红色
5 => 紫色
6 => 黄色
7 => 浅灰色
8 => 灰色
9 => 浅蓝色
10 => 浅绿色
11 => 浅水色
12 => 浅红色
13 => 浅紫色
14 => 淡黄色
15 => 白色

【讨论】:

  • regsvr32.exe "%systemroot%\system32\dynwrap.dll" 在 Windows 7、64 位上不适合我。这对我有用 softkube.com/blog/ansi-command-line-colors-under-windows
  • @Sawny 您应该将此作为完整答案发布,它在 Windows 8 x64 上对我有用!!!
  • @Sawny - 你是救生员!我多年来一直在寻找这个答案。你的答案不仅会做颜色——而且——它也会做其他的 ANSI 东西——比如将光标移动到一个新位置!我只想哭。你不知道我找了多久!这是上帝派来的。感谢一百万次!
【解决方案2】:

自 Windows 10 1511 起,Windows 中现在支持 ANSI 转义序列。 您可以从cmdphp 运行以下代码,如果您运行的是Windows 10 1511 及更高版本,您将获得彩色结果。

<?php
echo "\033[31mRed\n".    // Red Color Text 
     "\033[32mGreen\n".  // Green Color Text
     "\033[33mYellow\n". // Yellow Color Text
     "\033[34mBlue\n".   // Blue Color Text
     "\033[37mWhite\n";  // White Color Text
?>

我正在运行 Windows 10 1903,下面的屏幕截图显示了我在 cmd 中的脚本输出:

完整的转义序列参考:
https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

【讨论】:

    【解决方案3】:

    Windows 10 原生支持终端颜色 (full reference)。

    在 Windows 10 之前,ANSI 转义码在 Windows 命令提示符中本机不可用。对于较旧的 Windows,您可以尝试:

    在 bash shell 上它就像一个魅力,甚至还有一个 php 库:http://sourceforge.net/projects/milcovlib/

    如果这对你来说太过分了,你可以试试这个:

    echo "\033[31mred\033[37m\r\n";
    echo "\033[32mgreen\033[37m\r\n";
    echo "\033[41;30mblack on red\033[40;37m\r\n";
    

    这里是 bash 颜色代码列表:

    $black = "33[0;30m";
    $darkgray = "33[1;30m";
    $blue = "33[0;34m";
    $lightblue = "33[1;34m";
    $green = "33[0;32m";
    $lightgreen = "33[1;32m";
    $cyan = "33[0;36m";
    $lightcyan = "33[1;36m";
    $red = "33[0;31m";
    $lightred = "33[1;31m";
    $purple = "33[0;35m";
    $lightpurple = "33[1;35m";
    $brown = "33[0;33m";
    $yellow = "33[1;33m";
    $lightgray = "33[0;37m";
    $white = "33[1;37m";
    

    【讨论】:

    • 我的输出(Win 7 上的cmd.exe)是←[31mred←[37m
    • 是的,AFAIK cmd.exe 无法显示 ANSI,php 不喜欢 Win32 Console API。
    • 是的,我发现的所有材料都是使用转义序列定向到 bash 的。
    【解决方案4】:

    在 Windows 命令提示符下使用普通转义码似乎不起作用。 the other SO questions 上与此相关的答案说您需要使用 Win32 API。确实存在用于 PHP 的 Win32 API 库,但是 the documentation 确实有一个大的红色部分警告它是实验性。 YMMV。

    【讨论】:

      【解决方案5】:

      您可以使用 php-wcli 扩展来做到这一点。此扩展使用本机 Windows 功能而不是第三方 ansi 模拟器。 https://github.com/ZmotriN/php-wcli

      【讨论】:

      • 这符合“仅限链接的答案” - 您可以从描述解决方案的链接页面发布代码 sn-p/一段文本吗?
      【解决方案6】:

      试试这个:

      echo chr(27); //Escape char.
      echo "5;31;47"; //Graphic mode blink red on white 
      

      我手下没有 shell/php 环境,但这应该准确地输出你想要的。

      【讨论】:

      • 这是我得到的输出:←5;31;47
      • @Andreas 这似乎是在 Windows 系统上返回的输出。提供的解决方案仅适用于 Linux,无法在 Windows CLI 上实现,因为只有两种颜色(16 种可用,但您只能同时拥有两种)。
      • 是的,我在问题中明确指出我正在寻找 Windows 解决方案。
      • 对不起,你问题的“bash”部分让我忽略了“windows”部分。正如我告诉 Pekka 的那样,按标准方式这是不可行的。您需要编写一个全新的程序来输出颜色,然后,您必须将 php 输出通过管道传输到其中,...
      【解决方案7】:

      在 Windows 10(编译 19042.1110)PHP 7.4 上,这对我有用:

      echo("\x1b[31m Memory Testing \x1b[0m \n\r");
      

      转义序列是“\x1b[”

      "\x1b[31m" 代表红色

      "\x1b[0m" 用于“正常”颜色

      颜色代码为here

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2020-02-26
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        相关资源
        最近更新 更多