mac 命令行高亮显示的代码怎么高亮 powershell

1196人阅读
other(7)
咱们的博客中经常需要粘贴代码,所以我在博客中安装了WordPress的插件&&这是一个代码高亮、模式化的工具,能代码在网页上以类似IDE编辑器里的样子高亮关键字。
代码高亮显示效果:
安装方法:
& & 只需要在后台插件里搜索“SyntaxHighlighter Evolved”之后点击安装,启用即可。
使用方法:
& 在发布文章时,在“HTML”或者“文本”编辑模式下,使用如下三种方式中的一种把需要展示的代码包含起来即可: && & & & & & &
& & & &1. &[sourcecode language=&cpp&] 这里写你的代码 [/sourcecode]
& & & &2. &[code lang=&cpp&] 这里写你的代码 [/code]
& & & &3. &[cpp] 这里写你的代码 [/cpp]
& & & &注意:cpp为语言的别名
as3, actionscript3
bash, shell
cf, coldfusion
c-sharp, csharp
delphi, pas, pascal
diff, patch
erl, erlang
js, jscript, javascript
jfx, javafx
plain, text
ps, powershell
py, python
rails, ror, ruby
xml, xhtml, xslt, html, xhtml
参考文章:
& & & & & & & & & & & & &&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:447350次
积分:6734
积分:6734
排名:第3364名
原创:208篇
转载:71篇
评论:25条
(4)(1)(1)(1)(2)(1)(1)(2)(2)(1)(3)(2)(3)(10)(5)(5)(5)(23)(19)(10)(3)(175)Windows PowerShell 2.0创建调用脚本文件
Windows PowerShell 2.0创建调用脚本文件
编辑:www.fx114.net
本篇文章主要介绍了"Windows PowerShell 2.0创建调用脚本文件",主要涉及到Windows PowerShell 2.0创建调用脚本文件方面的内容,对于Windows PowerShell 2.0创建调用脚本文件感兴趣的同学可以参考一下。
在PowerShell中不存在文件和目录的概念,涉及文件和目录的操作总是转换为项(item)处理,即Get-Item、Get-ChildItem和Get-ItemProperty。在PowerShell中的dir命令以Get-ChildItem的别名出现,通过项操作对象的原因是PowerShell作用的任何类型的对象均以项的形式存在。而不像类Unix系统中将所有的对象都抽象成文件,即使这个对象很明显不是文件的情况。 项是包含内容的属性对象,这些对象又可以包含其他项。这个定义可以很容易扩展到文件和目录,即它们是具有各自内容和属性的项。项的概念可以应用于多个系统对象,提供程序(provider)用来创建、找回、修改和移除项。它是官方提供的重要的Shell扩展机制之一,Shell与一些内置的提供程序一起发布给用户,其中提供了提供程序的接口。 1 创建脚本 典型的PowerShell脚本是文本类型的文件,可以使用任何文本编辑器来创建。通常情况下,具有.ps1的文件后缀。最好使用一些语法高亮,甚至是智能补全功能的编辑器,如创建本书中脚本文件的Notepad++编辑器。这是一个功能强大的编辑器,支持多种语言,并且提供语法高亮及关键字补全等;另外可以在PowerShell控制台下使用Set-Content这个cmdlet来创建脚本文件。下面使用该命令创建一个脚本文件: PS C:/> $code = @"
>> Write-Host "Hello World!!"
PS C:/> Set-Content hello-world.ps1 $code
PS C:/> type hello-world.ps1
Write-Host "Hello World!!"
hello-world.ps1以普通的文本文件形式存在,可以使用type命令(以Get-Content命令的别名存在)来查看其内容。
1.1 调用脚本
在PowerShell中调用脚本文件时应在PATH环境变量中包含的路径中搜索,当前目录并不在系统的PATH中。调用当前目录中的脚本文件需要添加前缀,调用当前的脚本文件的方式应该是./hello-world.ps1。
如果当前目录默认包含在PATH中,则允许攻击者采用恶意代码覆盖同名的默认程序。假设恶意用户在共享目录中写入与内置cmdlet同名的脚本,当管理员访问这个共享目录时并调用了该脚本,则可导致恶意操作。因此在PowerShell和Unix的Shell中需要用户通过在当前路径前增加./前缀,显式地指明需要执行当前目录中的程序。
调用创建的hello-world.ps1脚本文件提示以下错误:
PS C:/> ./hello-world.ps1
File C:/hello-world.ps1 cannot be
loaded because the execution of scripts is
disabled on this system. Please see "get-help
about_signing" for more details.
At line:1 char:18
+ ./hello-world.ps1
从提示中可以看到抛出错误是因为当前脚本在使用的默认安全设置为不允许执行,Shell包含多种执行脚本的安全级别和用户权限策略,默认运行在Restricted(受限)策略级别下,既不允许执行脚本。可以通过执行Get-ExecutionPolicy命令查看当前脚本的执行权限:
PS C:/> Get-ExecutionPolicy
Restricted
为了能够执行正常的脚本操作,需要改变当前脚本的执行策略。预定义的脚本执行策略如下。
(1)Restricted:不允许执行任何脚本,而忽略用户是否具有超级用户权限,仍可执行控制台互交式命令。
(2)Allsigned:仅执行已经过受信第三方数字签名的脚本,关于签名脚本文件将在第12章中详细介绍。
(3)RemoteSigned:在执行任何来自Internet的脚本文件时要求其具有受信第三方数字签名;否则拒绝执行,执行本地创建的脚本文件不需要数字签名。
(4)Unrestricted:所有脚本均可执行,无论是否具有签名,或者签名是否合法。
RemoteSigned执行策略兼顾了好的网络安全级别和本地易用性。为了执行前面创建的脚本文件,使用Set-ExecutionPolicy命令调整安全策略级别,是这个cmdlet只能由超级管理员(administrator)来执行。如果是普通用户,则可右击PowerShell的快捷方式,然后选择快捷菜单中的“以管理员方式运行”(Run as administrator)选项,这样就有了以超级用户身份创建的shell线程,从而可以执行命令改变执行策略,如下:
PS C:/> Set-ExecutionPolicy RemoteSigned
PS C:/> Get-ExecutionPolicy
RemoteSigned
下例调用本地脚本文件:
PS C:/> ./hello-world.ps1
Hello World!!
另外脚本块执行操作符(&)也可执行脚本文件:
PS C:/> & ./hello-world.ps1
Hello World!!
PS C:/> & ./hello-world
Hello World!!
1.2 传递参数
脚本能够接收参数,这样可以针对不同对象执行所需操作。脚本文件支持$args变量,用于在执行时接收传递的参数。下例在指定目录中查找文件名符合指定通配符的文件:
$where = $args[0]
$what = $args[1]
if(!$what -match "/.wma$")
$what = $what + ".wma"
Get-ChildItem $where $what –Recurse
$what参数用来在通配符不包含.wma扩展名时添加扩展名,从而限制搜索文件的范围只限于.wma文件。代码递归遍历所有文件,并返回符合$what通配符的文件。将以上代码保存为Get-Music.ps1脚本文件,其中查找名为“ A Place Near by.wma”的音乐文件:
PS C:/> ./Get-Music.ps1 'D:/Music' *Near*
Directory: D:/Music
Mode LastWriteTime Length Name
---- ------------- ------ ----
20:38 3006849 A Place Near by.wma
脚本文件允许使用param语句定义自己的参数名,以避免$args参数对象要求输入参数的顺序必须与预定义顺序一致。下例用命名参数方式重写前面的脚本文件,并命名为“Get-Music-Param.ps1”:
param ($where,$what)
if(!$what -match "/.wma$")
$what = $what + ".wma"
Get-ChildItem $where $what –Recurse
其中的参数允许在不限制输入参数顺序的情况下调用脚本文件,下面调用该脚本文件查找名为“Dont You Forget.wma”的音乐文件:
PS C:/> ./Get-Music-Param.ps1 -where 'D:/Music' -what *You*
Directory: D:/Music
Mode LastWriteTime Length Name
---- ------------- ------ ----
21:19 3556057 Dont You Forget.wma
通过定义begin、process和end块来实现在管道命令中输入,下例获取文件序列并过滤掉所有大于指定大小的文件,将代码保存为FileSize-FilterLarge.ps1脚本:
param ($sizeLimit)
if($_.Length -ge $sizeLimit)
脚本文件接收文件大小变量用于后面检测所有管道命令传递项的大小,最后返回文件长度等于大小限制的文件。实例中的所有操作在process块中执行,当调用代码块时会作用于管道输入的所有项。begin和end块未执行任何操作,但是为了代码的完整性和可读性,总是习惯性地包含它们,即使其为空。下例使用脚本文件查找小于13个字节的文件:
PS C:/> dir *.txt | ./FileSize-FilterLarge.ps1 13
Directory: C:/
Mode LastWriteTime Length Name
---- ------------- ------ ----
14:31 12 digit.txt
6:27 13 test.txt
6:28 9 test2.txt
与函数相似,脚本文件会创建独立的变量作用域。即可读入由当前shell环境及其父作用域中的变量,对同名变量的写入会在当前作用域下覆盖父作用域中的值。下面创建一个访问父作用域的脚本文件:
PS C:/> $name = "LiMing"
PS C:/> Set-Content Variable-Scope.ps1 "Write-Host $name"
PS C:/> ./Variable-Scope.ps1
接下来演示如果在脚本文件中修改外部已经初始化的变量,是否会更改该变量的值,将以下代码保存为“Variable-ScopeInnerVariable.ps1”文件:
Write-Host "Variable Within script original: $name"
$name = "XiaoGang"
Write-Host "Variable Within script modified: $name"
调用这个脚本文件验证原有变量的内容:
PS C:/> $name = "LiMing"
PS C:/> ./Variable-ScopeInnerVariable.ps1
Variable Within script original: LiMing
Variable Within script modified: XiaoGang
PS C:/> Write-Host "Variable Outside of script $name"
Variable Outside of script LiMing
可以看出修改变量的操作只在脚本文件内部起作用,如果需要在脚本文件内部修改父作用域中的变量,则在脚本文件中使用$global作用域前缀或者Get-Variable/Set-Variable这类cmdlet显式要求修改父作用域变量。下例在脚本文件内使用$global关键字修改父作用域变量:
Write-Host "Variable Within script original: $global:name"
$global:name = "XiaoGang"
Write-Host "Variable Within script modified: $global:name"
将上述代码保存为“Variable-ModifyGloablVariable.ps1”文件,调用该文件时的提示如下:
PS C:/> $name = "LiMing"
PS C:/> ./Variable-ModifyGloablVariable.ps1
Variable Within script original: LiMing
Variable Within script modified: XiaoGang
PS C:/> Write-Host "Variable outside script :$global:name"
Variable outside script :XiaoGang
有时需要隔离特定的变量或函数,对于特定的脚本文件来说它是全局的。需要让其中定义的所有函数和脚本块能够访问该变量或函数,但用户需要显式强调不能在脚本文件外访问对象。这时不能使用$global作用域前缀,因为这将使该变量或函数暴露在所有代码面,无论它们是否已在脚本文件中定义。解决这个问题的方法是使用$script作用域前缀,为了说明这个问题,建立如下脚本文件代码:
$script:name = "LiuTao"
function Modify-Name()
$script:name = "XiaoGang"
Write-Host "Variable within script function scope:$script:name"
Write-Host "Variable Original script global scope: $script:name"
Modify-Name
Write-Host "Variable Modified script global scope: $script:name"
上述代码中存在脚本全局作用域和Modify-Name函数作用域,在shell可以通过引用$script:name调用脚本全局变量。将以上脚本另存为“Variable-ScriptScope.ps1”文件并调用:
PS C:/> $name = "LiMing"
PS C:/> ./Variable-ScriptScope.ps1
Variable Original script global scope: LiuTao
Variable within script function scope:XiaoGang
Variable Modified script global scope: XiaoGang
PS C:/> Write-Host "Variable outeside of script: $name"
Variable outeside of script: LiMing
能够看到对于脚本文件以外的$name变量并没有受到影响。
与此相对应,通过在脚本文件名前增加点(.)前缀来实现脚本文件访问所有的当前变量和函数,即将脚本文件点源引用(dot-sourcing)到当前shell进程中。点源引用使用点加空格再加上要引用的脚本文件名,将该脚本文件的所有变量、函数、脚本块释放在当前shell中供使用。下例以点源引用的方式来调用Variable-ScriptScope.ps1脚本文件:
PS C:/> $name = "LiMing"
PS C:/> . ./Variable-ScriptScope.ps1
Variable Original script global scope: LiuTao
Variable within script function scope:Mike
Variable Modified script global scope: Mike
PS C:/> Write-Host "Variable outeside of script: $name"
Variable outeside of script: Mike
由于使用了点源引用方式来调用同一个脚本文件,因此结果与之前不同,即修改了全局变量$name的值。
1.3 返回值
在大多数情况下,参数是外部世界传递数据到脚本文件的唯一通信机制。在脚本文件处理数据之后需要将结果返回给外部,在PowerShell中提供了很好的实现方法。
如果没有显式销毁、赋值给变量、管道输出或重定向到其他命令对象,则将会为下个命令输出到管道中,可以通过脚本生成一系列的对象并输出。下例输出3个缓存文件名:
PS C:/> $code = @"
>> "File1.tmp"
>> "File2.tmp"
>> "File3.tmp"
PS C:/> Set-Content Generate-TempFiles.ps1 $code
PS C:/> $files = ./Generate-TempFiles.ps1
PS C:/> $files
PS C:/> ./Generate-TempFiles.ps1 | foreach{"File:" + $_ }
File:File1.tmp
File:File2.tmp
File:File3.tmp
既可将对象赋给变量,也可传递到管道中的下一个命令。
下例中的return语句返回现有对象,并终止后续代码:
PS C:/> $code = @"
>> return "File1.tmp"
>> return "File2.tmp"
PS C:/> Set-Content Generate-TempFilesReturn.ps1 $code
PS C:/> ./Generate-TempFilesReturn.ps1
代码在第1个return语句之后终止,因而只输出一个文件对象。
如果是运行在顶层作用域中,return语句会退出脚本文件,但是上述代码中该语句只是退出当前作用域。即如果return语句是在脚本文件中的脚本块或函数中,只是退出该脚本块或函数,而脚本文件本身还将继续执行。为了显式退出脚本文件,需要使用exit语句。下例在脚本文件中的函数中退出整个脚本文件的执行:
function Verify-TextFile($file)
if(!$file.EndsWith(".txt"))
Write-Host "$file is not a text file"
$files = "Names.txt","Music.wma","Photo.jpg"
foreach($file in $files)
Verify-TextFile $file
将文件另存为“Explicit-Exit.ps1”,然后调用如下:
PS C:/> ./Explicit-Exit.ps1
Music.wma is not a text file
可以看到未执行检测Photo.jpg文件的操作,而是在检测Music.wma文件后退出。
2 从其他环境中执行脚本
PowerShell代码与已经存在的解决方案结合,才能发挥最大作用。可以编写所需脚本并在Windows的计划任务中调用,也可以将现有的脚本解决方案逐块转换为用PowerShell开发,或者用命令方式调用现有解决方案。所有自动化环境,包括任务计划服务、软件系统,以及执行外部命令都可以将PowerShell扩展进来。可以调用PowerShell.exe并把脚本块名作为参数:
C:/>PowerShell.exe hello-world.ps1
The term 'hello-world.ps1' is not recognized as a cmdlet, function, operable pr
ogram, or script file. Verify the term and try again.
At line:1 char:16
+ hello-world.ps1
提示不能识别hello-world.ps1脚本文件,出现这个错误的原因是PowerShell中的当前目录并不包含在PATH环境变量中。为执行当前目录中的脚本文件,需要在脚本文件前增加./前缀:
C:/>PowerShell.exe ./hello-world.ps1
Hello World!!
如果在脚本文件名中包含空格或者其他PowerShell不能正确解析的符号,则会出现错误,如下例:
C:/>PowerShell.exe ./hello world.ps1
The term './hello' is not recognized as a cmdlet, function, operable program, o
r script file. Verify the term and try again.
At line:1 char:8
外部调用PowerShell.exe和以参数形式执行脚本文件时,路径和文件名中不能包含空格。解析过程中空格前后被截断,只是把hello作为脚本文件名,这显然是错误。可以使用引号包含带空格的路径或文件名,然后使用执行操作符(&)执行脚本:
PS C:/> powershell.exe "& './hello world.ps1'"
Hello World!!
PowerShell允许用户创建由控制台程序返回的退出代码,这样可能通过为退出语句传递退出代码执行退出操作,即执行脚本和传递错误代码均可使程序退出。
3 开发和维护脚本库
复杂的功能会使大量的代码堆砌在一起,杂乱无章,不便于管理。如果需要实现复杂功能,最好将功能分割为相对独立且耦合性比较小的模块,这样形成的脚本文件将更便于重用和管理
3.1 以dot sourcing方式包含库
脚本库是包含有用函数的文件,可以被多次重用。库是不执行操作的普通PowerShell脚本文件,其中只是定义一些函数,让脚本库的客户代码调用。一个最简单的脚本库Library1.ps1的代码如下:
function LibHello()
Write-Host "Hello form Lib"
Write-Host "Library1.ps1 script included"
包含或导入脚本文件中的脚本库相当于执行它,下例从脚本文件中点源引用脚本库并执行其中的LibeHello函数:
PS C:/> . ./Library1.ps1
Library1.ps1 script included
PS C:/> LibHello
Hello form Lib
可以看到,除了对Library.ps1脚本块执点源引用操作外没有执行其他操作,但是脚本库中的函数却能够使用。
3.2 库路径
点源引用的缺点是所有和脚本库的相关路径以当前目录相对路径的形式存在,即一旦将脚本库释放在当前shell中,则其对于所有函数都是公开的。如果更换当前目录的位置,以全路径方式执行脚本文件将会报错,如下例:
PS C:/> ./Lib-User-DotSource.ps1
The term './Library.ps1' is not
recognized as a cmdlet, function,
operable program, or script file.
Verify the term and
try again.
At C:/Lib-User-DotSource.ps1:1 char:2
错误的原因在于对于shell来说Library.ps1在当前目录下,但在当前目录下无法找到这个脚本文件。而在没有对./Library.ps1执行成功的点源引用的前提下,无法找到LibHello函数。
本文首先介绍了创建和调用脚本文件的基础,然后分别示范了如何传递参数、管道传递对象及从脚本文件返回值。并且对比了脚本文件同函数和脚本块在传递参数、操作管道输入及返回值之间的联系,三者以相同的方式执行。本文还介绍了如何在其他环境下调用PowerShell并使其一起工作,最后说明了创建脚本库的方式。
赛迪网地址:/art/08/.html
作者: 付海军
出处:http://blog.csdn.net/fuhj02
版权:本文版权归作者和csdn共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu/
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:[命令行] 配置颜色(windows cmd,powershell,linux console) - 博客频道 - CSDN.NET
Station of GoGdizzY
teenie-weenie boy servant of a scholar, absurdity, absurdity.
分类:Software
修改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 {
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.
Get-ChildItemColor
Tojo2000 &&
$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' }
$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...\]'
// 改成这样的模式,每个颜色控制符都加
排名:第8582名
(10)(2)(8)(6)(4)(5)(4)(7)(7)(10)(4)(17)(3)(1)(11)(2)(5)(2)(2)(2)(1)(2)(1)(3)(1)(1)(1)(1)(3)(1)(1)

我要回帖

更多关于 mac 命令行高亮 的文章

 

随机推荐