您的位置:首页 > 运维架构 > Shell

[命令行] 配置颜色(windows cmd,powershell,linux console)

2012-01-13 11:35 549 查看

修改cmd的颜色

color=xy其中x(前景色)和y(背景色)分别可以取以下几种值: 0 = 黑色 8 = 灰色

1 = 蓝色 9 = 淡蓝色

2 = 绿色 A = 淡绿色

3 = 浅绿色 B = 淡浅绿色

4 = 红色 C = 淡红色

5 = 紫色 D = 淡紫色

6 = 黄色 E = 淡黄色

7 = 白色 F = 亮白色

例如color=28直接输入color会恢复至默认设置。

修改powershell的颜色

先大致介绍一下powershell的相关信息。powershell自己拥有很多cmdlet,将很多命令做了alias,例如‘dir’和‘ls’都指向get-childitem,这样无论你习惯win还是linux的命令行,都可以用了。powershell的脚本语法有自身特点,支持一些.net语法,可以自己写一些函数实现某些功能,这里介绍的主要是修改颜色的一些方法。首先,个性化的配置需要每次启动都生效,那么就需要有个用户配置文件。默认的powershell启动时加载配置文件可以在以下路径中寻找。

描述                       路徑
-----------                ----
目前使用者、目前主機       $Home\[My ]Documents\WindowsPowerShell
\Profile.ps1
目前使用者、所有主機       $Home\[My ]Documents\Profile.ps1
所有使用者、目前主機       $PsHome\Microsoft.PowerShell_profile.ps1
所有使用者、所有主機       $PsHome\Profile.ps1

設定檔路徑包含下列變數:

- $PsHome 變數:用於存放 Windows PowerShell 的安裝目錄。

- $Home 變數:用於存放目前使用者的主目錄。
假设我的配置文件路径在“C:\Users\GogdizzY\Documents\WindowsPowerShell\profile.ps1”

内容如下:
set-alias ll         Get-ChildItemColor

function prompt
{
$my_path = $(get-location).toString()
$my_pos = ($my_path).LastIndexOf("\") + 1
if( $my_pos -eq ($my_path).Length ) { $my_path_tail = $my_path }
else { $my_path_tail = ($my_path).SubString( $my_pos, ($my_path).Length - $my_pos ) }
Write-Host ("[") -nonewline -foregroundcolor 'Green'
Write-Host ("Gogdizzy") -nonewline -foregroundcolor 'Red'
Write-Host ("@") -nonewline -foregroundcolor 'Yellow'
Write-Host ("WIN7 ") -nonewline -foregroundcolor 'Magenta'
Write-Host ($my_path_tail) -nonewline -foregroundcolor 'Blue'
Write-Host ("]#") -nonewline -foregroundcolor 'Green'
return " "
}

function Get-ChildItemColor {
<#
.Synopsis
Returns childitems with colors by type.
.Description
This function wraps Get-ChildItem and tries to output the results
color-coded by type:
Directories - Cyan
Compressed - Red
Executables - Green
Text Files - Gray
Image Files - Magenta
Others - Gray
.ReturnValue
All objects returned by Get-ChildItem are passed down the pipeline
unmodified.
.Notes
NAME:      Get-ChildItemColor
AUTHOR:    Tojo2000 <tojo2000@tojo2000.com>
#>
$regex_opts = ([System.Text.RegularExpressions.RegexOptions]::IgnoreCase `
-bor [System.Text.RegularExpressions.RegexOptions]::Compiled)

$fore = $Host.UI.RawUI.ForegroundColor
$compressed = New-Object System.Text.RegularExpressions.Regex(
'\.(zip|tar|gz|rar|7z|tgz|bz2), $regex_opts)
$executable = New-Object System.Text.RegularExpressions.Regex(
'\.(exe|bat|cmd|py|pl|ps1|psm1|vbs|rb|reg|sh), $regex_opts)
$text_files = New-Object System.Text.RegularExpressions.Regex(
'\.(txt|cfg|conf|ini|csv|log), $regex_opts)
$image_files = New-Object System.Text.RegularExpressions.Regex(
'\.(bmp|jpg|png|gif|jpeg), $regex_opts)

Invoke-Expression ("Get-ChildItem $args") |
%{
if ($_.GetType().Name -eq 'DirectoryInfo') { $Host.UI.RawUI.ForegroundColor = 'Cyan' }
elseif ($compressed.IsMatch($_.Name)) { $Host.UI.RawUI.ForegroundColor = 'Red' }
elseif ($executable.IsMatch($_.Name)) { $Host.UI.RawUI.ForegroundColor = 'Green' }
elseif ($text_files.IsMatch($_.Name)) { $Host.UI.RawUI.ForegroundColor = 'Gray' }
elseif ($image_files.IsMatch($_.Name)) { $Host.UI.RawUI.ForegroundColor = 'Magenta' }
else { $Host.UI.RawUI.ForegroundColor = 'Gray' }
echo $_
$Host.UI.RawUI.ForegroundColor = $fore
}
}

function Show-Color( [System.ConsoleColor] $color )
{
$fore = $Host.UI.RawUI.ForegroundColor
$Host.UI.RawUI.ForegroundColor = $color
echo ($color).toString()
$Host.UI.RawUI.ForegroundColor = $fore
}

function Show-AllColor
{
Show-Color('Black')
Show-Color('DarkBlue')
Show-Color('DarkGreen')
Show-Color('DarkCyan')
Show-Color('DarkRed')
Show-Color('DarkMagenta')
Show-Color('DarkYellow')
Show-Color('Gray')
Show-Color('DarkGray')
Show-Color('Blue')
Show-Color('Green')
Show-Color('Cyan')
Show-Color('Red')
Show-Color('Magenta')
Show-Color('Yellow')
Show-Color('White')
}
可以看到,通过alias,将ll命令关联到Get-ChildItemColor,里面通过文件后缀来决定使用什么颜色。

Get-ChildItemColor是我从网上拷贝的,稍微作了修改。

另外我提供了两个命令,Show-Color和Show-AllColor,如果你有任何需求,可以修改代码中的颜色。

定制个性化的prompt,这是通过重定义function prompt来实现的,即用户的函数替代了系统提供的默认函数,里面通过Write-Host中的-foregroundcolor选项,提供了彩色的命令提示符。



修改linux console的颜色

linux的ls命令本来就就有--color的选项,我使用secureCRT连接linux,所以直接在secureCRT里面设置配色方案。下面讲一下配置彩色的命令行提示符,linux是通过设置PS1变量来实现的。我的PS1变量内容如下:

export PS1 = '`_a=$?; if [ $_a -ne 0 ]; then _a="   "$_a; echo -ne "\[\e[s\e[1A\e[$((COLUMNS-2))G\e[31m\e[1;41m${_a:(-3)}\e[u\e[0m\]"; fi`\[\e[01;32m[\e[31m\u\e[33m@\e[35m\h \e[34m\W\e[32m\]]\$'
这是我从一个人的博文中抄过来的,主要是在彩色的功能上增加了显示错误代码的能力,下面解释一下含义:

_a=$?; if [ $_a -ne 0 ]; then _a="   "$_a;
$?是上一个命令的返回值,如果不是0,那必然是错误代码,将其保存在$_a变量中,并在前面添加3个空格;

echo -ne "\[\e[s\e[1A\e[$((COLUMNS-2))G\e[31m\e[1;41m${_a:(-3)}\e[u\e[0m\]";
'\e['是一个控制码,紧跟在在这个控制码后面的字符是由特殊含义的.

'\e[s' 保存当前光标位置

'\e[1A' 向上移动一行

'\e[$((COLUMNS-2))G' $COLUMNS变量存储当前的行宽,相当于移动到最后一个位置的前两个,实际是倒数第三个位置。

'\e[31m' 设置前景色为红色

'\e[1;41m' 设置后景色为红色,前景色加亮

'${a:(-3)}' 取a变量的后3个字符(这下知道前面为什么加3个空格了?因为如果a的长度不够3个,那么需要用空格补够,否则会出错)

'\e[u' 恢复光标位置

'\e[0m' 取消颜色设置

注意,所有控制码命令需要用'\['和'\]'包含起来。

\[\e[01;32m[\e[31m\u\e[33m@\e[35m\h \e[34m\W\e[32m\]]\$
这一段是对prompt的设置,主要是配置颜色,需要注意其中有控制码相关的方括号,也有prompt内容的方括号。

'\e[01,32m[' 显示高亮,绿色的左方括号

['\e[31m\u' 显示红色用户名(\u不是控制码控制,而是PS1中内建的名称),继承高亮属性。

'\e[33m@' 显示黄色的@,继承高亮属性。

'\e[35m\h' 显示粉色的主机名(\h是PS1内建名称,显示主机名),继承高亮属性。

'\e[34m\W' 显示蓝色路径名(\W显示相对路径,\w显示绝对路径),继承高亮。

'\e[32m\]' 结束了控制符,并且颜色设置为绿色,继承高亮。

']\$ ' 显示右方括号],然后显示提示符(\$,当是root用户时显示#,其他用户显示$)



设置PS1会遇到的问题

有的系统似乎不识别\e这个控制符,要用\033代替。

有的系统设置后,按up键,查看历史命令,会发现提示符prompt消失了,这是因为有的系统对颜色控制符的要求比较严格,必需用“\[”和“\]”把每一个颜色控制符都包含进去。所以我上面所写的PS1环境变量只是在某些系统中可以正确运行,但是放到另外一些系统中可能会有问题,修改如下:

'\[\e...\e...\e...\]'       // 之前所说类似这样的模式,只在头和尾加1次
'\[\e...\]\[\e...\]\[\e...\]'     // 改成这样的模式,每个颜色控制符都加
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: