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

修改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...\]'     // 改成这样的模式,每个颜色控制符都加





  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值