为 PHP 的 Windows 命令行输出着色

Posted

技术标签:

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

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

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

【问题讨论】:

好问题!虽然我认为cmd.exe 根本无法做到这一点。 啊,看来还是可以的。 ***.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 转义码。 【参考方案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,您可以尝试:

用 ansihack.exe http://gynvael.coldwind.pl/?id=130&lang=en 修补 cmd.exe :) http://adoxa.110mb.com/ansicon/index.html

在 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 输出通过管道传输到其中,... 如前所述:softkube.com/blog/ansi-command-line-colors-under-windows 有效。【参考方案7】:

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

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

转义序列是“\x1b[”

"\x1b[31m" 代表红色

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

颜色代码为here

希望对你有所帮助。

【讨论】:

以上是关于为 PHP 的 Windows 命令行输出着色的主要内容,如果未能解决你的问题,请参考以下文章

Windows的idea的Terminal替换为git bash(默认是Windows的cmd.exe命令行)

Windows的idea的Terminal替换为git bash(默认是Windows的cmd.exe命令行)

如何将 CSS 自动应用于 console.log 着色[重复]

如何在 Windows 上使用命令行访问 PHP?

如何在 WAMPServer 中从 Windows 命令行运行 PHP

使用 SCons 着色编译器诊断