那么这意味永远不需要在Windows PowerShell中处理文本和字符串操作吗?不,抱歉:文本及字符串操作对于任何一个写系统管理脚本的人来说仍然是需要的。幸运的是,Windows PowerShell(及.NET Framework)包含了各种为了操作文本及字串值的所有漂亮的小功能的集合。让我们看一些你能针对文本所做的有趣的事。因此,我们准备主要处理以下变量及值:
$a = "Scripting Guys"
$b = "scripting guys"
比较两个字符串值
那么什么样的事需要你来处理字符串值呢?好的,一件非常普通的任务就是比较这些值。以下命令比较了字符串变量$a和$b,然后把结果储存在第三个变量($d):
$d = $a.CompareTo($b)
如你所见,我们简单的使用$a及调用CompareTo方法,并传递第二个字符串($b),作为方法参数。如果CompareTo返回0,那意味着两个字符串相等。0以外的任何值意味着两个字符串不相等。(技术上来说,-1意味着$a小于$b,1意味着$a大于$b)
当我们运行这个命令并回显$d的值的时候我们会得到以下输出:
1
这意味这两个字符串不相等。
怎么会这样?你们的一些人也许会认为两个字符串没什么不同的。好的这和你是否进行大小写敏感比较相关(大写的S被认为和小写的s不同),或者大小写不敏感比较,这意味着大写S同小写s被认为是一样的。
Compare方法总是进行大小写敏感比较。为了进行大小写不敏感比较,那么使用以下命令作为替代:
$d = [string]::Compare($a, $b, $True)
在本例中,我们使用.Net Framework的System.String类(也就是[string]语法所指出的)。我们然后调用静态方法(以两个冒号::指出)Compare,并传递给这个方法三个参数:两个我们想要比较的字符串($a及$b)然后是布尔值$True。第三个参数告诉Compare方法是否在进行比较时忽略字母的大小写。值$True意味着应当忽略字母的大小写。运行这个命令以后$d的值将会等于:
0
这意味着,在你忽视大小写的情况下,两个字符串是相等的。
你也能使用StartsWith及EndsWith方法来快速确定在指定值的开始或结束是否包含指定字符串。想要知道$a的值的开头是否包含字符串Script?那么使用这个命令吧:
$d = $a.StartsWith("Script")
结果是,如果目标文本被找到$d将会是True,如果没有则为False。
或者检查在值尾是否有目标文本:
$d = $a.EndsWith("Script")
注意这些比较也是大小写敏感的。如果要做大小写不敏感比较则使用下面这个类似的命令:
$d = $a.ToLower().StartsWith("script")
ToLower方法代表什么呢?我们马上会解释的。
改变文本大小写
如我们刚才所见,字母大小写有时是很重要的。因此,你可能想要使用ToUpper或者ToLower方法来转换所有字符串值中的字母至同样的字母大小写。那么字母大小写将不会影响你做的任何比较。为了转换所有的字符串中的字符至大写相当于我们使用这个命令:
$d = $a.ToUpper()
因此,$d将会等于以下内容:
SCRIPTING GUYS
反之,使用ToLower方法将转换字母至小写格式。这个命令将先前的全部都是大写字母的至转换成小写值:
$d = $d.ToLower()
运行这个命令,$d将会等于以下内容
scripting guys
瞧见了吧?我们说了我们一会儿会解释ToLower方法是什么意思的。
检查字符串中是否包含某个字符串
那么人们还对字符串值做什么呢?好的,一个普通的任务是判断给定的子字符串是否能在该值中任意处找到。例如,假设你需要知道字符串ript是否出现在$a(如你回想起的那样,该值是Scripting Guys)值的任意位置。我们怎么样判断呢?像这样:
$d = $a.Contains("ript")
我们在这里所做的是使用$a并调用Contains方法,并传递目标文本(ript)做为唯一的方法参数。如果目标本文能被找到,那么Contains方法返回True(本例中可以),反之则返回Flase。
注意到Contains方法总是采取大小写敏感搜索是很重要的。如果我们查找字符串RIPT,Contains将会告诉我们这个文本不能被找到。那么如果我们关心字母大小写,只关心实际字符本身呢?好的,一种处理这个问题的方法是将两个字符串变量($a)及目标文本(RIPT)都转换成小写或者大写字符。以下命令返回True值:
$d = $a.ToLower().Contains("RIPT".ToLower())
替换字符串中的文本
如果你精读Hey, Scripting Guy! archive(当然,你应当经常精读Hey, Scripting Guy! archive)你也许会惊讶于许多脚本要求你用一个文本替换另一个文本。例如,假设$a被赋了以下值:
$a = "The Scriptign Guys"
这不好,我们把Scripting拼错了。但是不要紧,这修正起来很简单:
$a = $a.Replace("Scriptign", "Scripting")
如你所见,所有我们所做的是赋给$a新值:即当我们调用Replace方法后的值。注意我们传递给这个方法两个参数:我们想要替换的值(Scriptign)及用来替换的文本(Scripting)。在我们运行这个命令以后$a将会等于以下内容:
The Scripting Guys
下面是另外一个例子。假设$a等于这个:
$a = "Microsoft Scripting Guys"
假设我们想要摆脱Scripting Guys。(相信我们,我们知道Microsoft内部很多人想要这么做。)好的,我们再次调用Replace方法,这次我们指定空字符串(””)做为替换文本(也包括Scripting前的空格):
$a = $a.Replace(" Scripting Guys", "")
再次,我们运行这个命令,Scripting Guys将会消失,$a将会等于以下内容:
Microsoft
要是现实中有那么简单就好了,嗯?
返回字符串的位置
有些时候你不想要整个字符串的值:你只想要该字符串值的位置。例如,当你处理活动目录的时候你经常得到看起来和下面类似的输出:
$e = "CN=Ken Myer"
那么,你经常发现你自己一直在写代码来去除每个名字前的CN=。想要找一个更简单的办法?那么你来对地方了:
$e = $e.Substring(3)
所有我们在这里所做的是取得我们的字符串变量然后调用Substring方法。我们传递给Substring一个参数:我们想要开始提取字符的开始位置。如果我们传递给Substring一个3(如我们所做的)这意味着我们想要从位置3开始提取字符,然后因为我们没有提供可选的第二个参数,我们想要一直提取字符知道我们到达字符尾。因此,这意味着$e将会等于:
Ken Myer
啊,问得好:在Ken Myer中的K是字符串中的第四个字符,那为什么我们不传递给Substring一个4做为参数?
无论相信与否,关于这个问题有一个简单的解释:字符串中第一个字符被认为是字符0;字符被以下方式编号:
012345678910
CN=Ken.Myer
这就是我们为什么传递3而不是4的原因。
那关于那个神秘的第二参数呢?事实上,它也没有那么神秘;这个参数告诉Substring方法有多少字符将被提取。在Substring中包含这个参数将会提取指定数量的字符。省去这个参数,那么Substring将从指定的字符位置开始并提取字符串中剩下的所有字符。
记住这点,我们再次处理下我们$e的原始值(CN=Ken Myer),你猜当我们运行这个命令后$呃将会等于什么:
$e = $e.Substring(3,3)
你会得到:
Ken
额外提示
考虑下包含以下内容的一个文件夹(对数码相机用户来说是很熟悉的):
HIJK_111112.jpg
HIJK_111113.jpg
HIJK_111114.jpg
HIJK_111115.jpg
假设我们想要移除每个文件的HIJK_前缀。你怎么做呢?好的,这里有一个方法,使用字符串值取代了文件系统对像及文件名属性(尽管方法是相同的):
$d = "HIJK_111112.jpg"
$e = $d.TrimStart("HIJK_")
将字符串变为数组
无论相信与否,当你找到有效的将字符串值转换成数组时总是很好的。例如,假设我们一部分像这样的数字:
$e = "9BY6742W"
很可能在这部分中的每一个字符都有特定的含义;例如,也许第一个字符(9)代表了设备的制造工厂。在像这样的例子中,你可能想要独立的查找每个字符,如果整个字符串被转换为包含单个字符的数组那将是很简单的。但是,你如何转换一个字符串值至独立的字符数组?
我们很高兴你能问这个问题:
$d = $e.ToCharArray()
如你所见,我们简单的字符串变量$e并调用ToCharArray方法(没有必须的参数)。当我们使用这个方法后$d将会怎么样呢?看上去比较糟糕:
9
B
Y
6
7
4
2
W
下周见。
英文原文
http://www.microsoft.com/technet/scriptcenter/resources/pstips/sept07/pstip0921.mspx
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |