第25章 额外的提示,技巧以及技术
到目前为止,一个月的“午饭学习时间”已经接近尾声。因此我们想给你分享一些额外的提示与技巧完成这次学习之旅。
25.1 Profile、提示以及颜色:自定义Shell界面
25.1.1 PowerShell Profile脚本
首先PowerShell引擎会执行命令,然后托管应用程序再显示执行结果。托管应用程序的另一个功能是当新开一个Shell窗口时,载入和运行Profile脚本。
这些Profile脚本可被用作自定义PowerShell的运行环境——能够自定义的包括:载入SnapIn管理单元或模块,切换到另外的路径,定义需要使用的功能等。例如:下面是在Don在计算机上使用的一个Profile脚本。
Import-Module ActiveDirectory
Add-PSSnapIn SqlServerCmdletSnapIn100
该Profile载入了Don最常用的两个Shell的扩展程序,并修改根路径为C盘。
在PowerShell中,并没有默认的Profile脚本存在,你创建的Profile脚本会依赖于你期望该脚本的工作方式。
下面是控制台宿主尝试载入的一些文件,以及尝试载入这些文件的顺序。
(1)$PsHome/Profile.PS1——不管使用何种托管应用程序,计算机上的所有用户都会执行该脚本(请记住,PowerShell已经预定义了$PSHome,该变量包含PowerShell的安装文件夹的路径)。
(2)$PsHome/Microsoft.PowerShell.PS1——如果该计算机上的用户使用了控制台宿主,那么就会执行该脚本。如果他们使用的是PowerShell的ISE,那么会执行$PsHome/Microsoft.PowerShellISE.Profile.ps1脚本。
(3)$Home/Documents/WindowsPowerShell/Profile.PS1——无论用户使用的是何种托管程序,只有当前用户会执行该脚本(因为该脚本存在于用户的根目录下)。
(4)$Home/Documents/WindowsPowerShell/Microsoft.PowerShell_Profile.PS1——只有当前使用PowerShell控制台的用户才会执行该脚本。如果用户使用的是PowerShell ISE,那么会执行$Home/Documents/WindowsPowerShell/Microsoft.PowerShellISE_Profile.PS1。
如果上面脚本中某一个或者几个不存在,那么也没关系。托管应用程序会跳过不存在的脚本,继续寻找下一个可用的脚本。
$PsHome是包含PowerShell安装路径信息的内置变量;大部分操作系统中,该变量的值是C:\Windows\System32\WindowsPowerShell\V1.0。
因为期望将相同的Shell扩展程序载入到PowerShell,而不管使用控制台还是ISE,所以我们选择自定义$Home\Document\WindowsPowerShell\Profile.PS1——因为该Profile脚本在微软提供的两种托管应用程序中都可以运行。
请记住,Profile脚本也仅是脚本而已,它会依赖于PowerShell的当前执行策略。如果设置的执行策略是Restricted,那么Profile脚本就无法运行;如果设置的执行策略是AllSigned,那么Profile脚本必须经过签名才能运行。
25.1.3 调整颜色
默认的文本前景色与后景色都可以通过单击PowerShell命令窗口左上角的边框来修改。选择“属性”,之后切换到“颜色”标签页。
修改错误、警告以及其他信息的颜色略微有点复杂,需要通过运行命令才能实现。但是你可以将这部分命令放到Profile脚本中,这样每次进入PowerShell时,都会执行这些命令。比如下面的命令可以将错误消息的前景色修改为绿色,这样你可以觉得稍微舒缓一点。
(Get-Host).PrivateData.ErrorForegroundColor="Green"
25.2 运算符:-AS、-IS、Replace、-Join、Split、-IN、-Contains
这些额外的运算符在多种情形下都非常有用,可以通过它们来处理数据类型、集合与字符串。
25.2.1 -AS和-IS
-AS运算符会将一种已存在的对象转换为新的对象类型,从而产生一个新的对象。例如,如果存在一个包含小数的数字(可能来自一个除法计算),可以通过Converting或者Casting将该数字转化为一个整数。
1000 / 3 -AS [INT]
语句的结构:首先是一个被转换的对象,然后是-AS运算符,最后是一个中括号,中括号中包含转化之后的类型。这些类型可以是[string]、[XML]、[INT]、[Single]、[Double]、[Datetime]等,罗列的这些类型应该是你经常用到的类型。从技术来讲,在该示例中,将数值转化为整数是指将小数部分通过四舍五入方式转为整数,而并不是简单地将小数部分去掉。
-IS运算符通过类似方式实现。该运算符主要用于判断某个对象是否为特定类型,如果是,则返回True,否则为False。比如下面的这些示例。
123.45 -IS [INT]
"SERVER-R2" -IS [String]
$True -IS [Bool]
(Get-Date) -IS [DateTime]
25.2.2 -Replace
-Replace运算符主要用于在某个字符串中寻找特定字符(串),最后将该字符(串)替换为新的字符(串)。
PS C:\>"192.168.34.12" -Replace "34","15"
192.168.15.12
25.2.3 -Join和-Split
-Join和-Split运算符主要用作将数组转化为分隔列表和将分隔列表转化为数组。例如,存在包含5个元素的数组。
PS C:\>$Array = "one","two","three","foure","five"
PS C:\>$Array
one
two
three
four
five
因为PowerShell会自动将逗号隔开的列表识别为一个数组,所以上面的命令可以执行成功。假如现在需要将这个数组里的值转换为以管道隔开的字符串,可以通过-Join来实现。
PS C:\>$Array -Join "|"
one|two|three|four|five
同时,我们可以使用-Split运算符实现相反的效果:它会从一个分隔的字符串中产生一个数组。例如,假如存在仅包含一行四列数据的一个文件,在该文件中以制表符对列进行隔离。将该文件的内容显示出来,类似下面这样。
PS C:\>Gc Computers.tdf
Server1 Windows East Managed
你可以通过-Split运算符将该内容拆成4个独立的数组元素。
PS C:\>$Array = (Gc Computers.tdf) -Split "`t"
$Array
Serverl
Windows
East
Managed
请注意,这里我们使用转义字符、一个重音符及一个“t”(`t)表示制表符。这些字符必须包含在一个双引号中,这样PowerShell才能识别该转义字符。
产生的数组中包含4个元素,可以通过它的索引编号单独查询对应元素。
PS C:\>$Array[0]
Server1
25.2.4 -Contains和-In
-Contains运算符对PowerShell初学者而言可能比较容易混淆。他们可能会尝试下面的脚本。
PS C:\>'this' -Contains '*his*'
False
实际上,他们是期望运行-like运算符。
PS C:\>'this' -Like '*his*'
True
-Like运算符用于进行通配符比较运算。-Contains运算符主要用作在一个集合中查找是否存在特定对象。比如,创建包含多个字符串对象的一组集合,然后检查特定对象是否包含在该集合中。
PS C:\>$Collection = 'abc','def','ghi','jkl'
PS C:\>$Collection -Contains 'abc'
True
PS C:\>$Collection -Contains 'xyz'
False
-In运算符实现相同的功能,但是它会颠倒运算对象的顺序。也就是说,集合在右边,而需要检查的对象在左边。
PS C:\>$Collection = 'abc','def','ghi','jkl'
PS C:\>'abc' -IN $Collection
True
PS C:\>'xyz' -IN $Collection
False
25.3 字符串处理
假如存在一个字符串,你需要将该字符串全部转化为大写,或者你可能需要取得该字符串的最后3个字符。那么该如何实现?
在PowerShell中,字符串是对象,所以会存在多种方法(Method)。
PS C:\>"Hello" | gm
下面是一些比较有用的String方法。
- IndexOf()会返回特定字符在字符串中的位置。
- Split(),Join()和Replace()类似于上面讲到的-Split,-Join和-Replace。但是我们更加倾向于使用PowerShell的运算符而不是String的方法。
- ToLower()和ToUpper()可以将字符串转化为小写或大写。
- Trim()会将一个字符串的前后空格去掉;TrimStart()和TrimEnd()会将一个字符串的前面或者后面的空格去掉。
PS C:\>$UserName = " Don"
PS C:\>$UserName.Trim()
Don
25.4 日期处理
和String类型对象一样,Date(如果你喜欢,也可以是DateTime)对象也包含多个方法。通过这些方法,可以对日期和时间进行处理和计算。
PS C:\>Get-Date | Gm
请记住,通过上面列表中的属性可以访问一个DateTime的部分数据,比如日期、年或者月。
PS C:\>(Get-Date).Month
10
上面列表中的方法可以实现两个功能:计算或者将DateTime转化为其他格式。例如,假如需要获取90天之前的日期,使用AddDays()方法和一个负数参数实现。
PS C:\>$Today = Get-Date
PS C:\>$90DaysAgo = $Today.AddDays(-90)
PS C:\>$90DaysAgo
2014年12月19日 9:36:47
名称中以“To”开头的方法可以实现将日期以及时间转化为某种特定格式,比如短日期类型。
PS C:\>$90DaysAgo.ToShortDateString()
2014/12/19
25.5 处理WMI日期
在WMI中存储的日期和时间格式都难以直接利用。例如,Win32_OperatingSystem类主要用来记录计算机上一次启动的时间,其上期和时间格式如下。
PS C:\>Get-WMIObject Win32_OperatingSystem | Select LastBootUptime
LastBootUpTime
----------------
20150317090459.125599+480
PowerShell的设计者知道直接使用这些信息会比较困难,所以他们对每一个WMI对象添加了一组转换方法。将WMI对象通过管道发送给Gm,请注意观察最后两个方法。
PS C:\>WMIObject Win32_OperatingSystem | Gm
将输出结果集中间的大部分信息去除,这样你能很轻易地发现后面的ConvertFromDateTime()方法和ConvertToDateTime()方法。在该示例中,获取到的是WMI的日期和时间。假如需要转化为正常的日期和时间格式,请参照下面的命令。
PS C:\>$OS = Get-WMIObject Win32_OperatingSystem
PS C:\>$OS.ConvertToDateTime($OS.LastBootUpTime)
2015年3月17日 9:04:59
如果你期望将正常的日期和时间信息放入一个正常表中,你可以通过Select-Object或者Format-Table命令创建自定义计算列以及属性。
PS C:\>Get-WMIObject Win32_OperatingSystem | Select BuildNumber,__Server,@{l='LastBootTime';E={$_.ConvertToDateTime($_.LastBootUpTime)}}
BuildNumber _Server LastBootTime
7601 SERVER1 2015/3/17 9:04:59
标签:Profile,25,额外,技巧,PS,运算符,字符串,脚本,PowerShell
From: https://www.cnblogs.com/evan-whc/p/17091710.html