为 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 转义序列。
您可以从cmd
和php
运行以下代码,如果您运行的是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 着色[重复]