在PowerShell中,
一切皆对象
。用技术术语来说,
对象
是某个模板的单个实例。这个模板称为
类
,指明了对象包含的东西。对象所属的类决定其有哪些
方法
可用,即在对象上可以执行什么操作。换句话说,方法就是对象可以做的事情。例如,列表对象可能会有一个
sort()
方法,调用该方法可对列表进行排序。同时,对象所属的类还决定了对象的
属性
,即对象的变量。可以将属性理解为与对象有关的全部数据。对列表对象来说,可能会有
length
属性,以存储列表中的元素数量。有时类会为对象的属性提供默认值,但更多时候需要自己动手为对象的属性提供值。
前面一段话十分抽象,接下来以汽车为例进行说明。在设计阶段,汽车只是一个计划。这个计划(或称模板)定义了汽车的外观、使用何种发动机、使用何种底盘,等等。这个计划还列出了汽车可以做哪些事,比如前进、后退,以及开关天窗。可以将这个计划理解为汽车所属的类。
我们根据这个类来制造汽车,为汽车配备全部属性,并添加各种方法。同一个型号的汽车可以是蓝色的,也可以是红色的,还可以使用不同的变速器。这些都是具体某一辆汽车的属性。同样,每辆汽车都可以前进、后退,而且开关天窗的方法都一样。这些操作是汽车的方法。
基本了解对象后,我们在PowerShell的语境下来使用和处理对象。
首先,为了一探究竟,了解PowerShell对象的方方面面,需要创建一个简单的对象。代码清单2-17创建了一个简单的字符串对象
$color
。
代码清单2-17 创建字符串对象
PS> $color = 'red'
PS> $color
red
注意,调用
$color
得到的只是该变量的值。但变量是对象,除了值以外,还有更多信息。变量也有属性。
如果想查看对象的属性,可以使用
Select-Object
命令,指定
Property
参数。将
Property
参数的值设为一个星号,让PowerShell返回找到的全部属性,如代码清单2-18所示。
代码清单2-18 查看对象的属性
PS> Select-Object -InputObject $color -Property *
Length
------
3
可以看到,
$color
字符串只有一个名为
Length
的属性。
可以使用
点记法
直接引用
Length
属性:先输入对象的名称,后跟一个点号,然后输入想访问的属性名称,如代码清单2-19所示。
代码清单2-19 使用点记法查看对象的属性
PS> $color.Length
3
一段时间后你便会习惯这种引用对象属性的方式。
Get-Member
cmdlet
通过
Select-Object
,我们发现
$color
字符串只有一个属性。但别忘了,有些对象可能还有方法。如果想查看这个字符串对象的所有方法和属性,可以使用
Get-Member
cmdlet,如代码清单2-20所示。在很长一段时间内,我们将经常使用这个cmdlet。使用它可以快速列出某个对象的属性和方法,二者合称对象的
成员
。
代码清单2-20
用
Get-Member
查看对象的属性和方法
PS> Get-Member -InputObject $color
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone(), System.Object ICloneable.Clone()
CompareTo Method int CompareTo(System.Object value),
int CompareTo(string strB), int IComparab...
Contains Method bool Contains(string value)
CopyTo Method void CopyTo(int sourceIndex, char[] destination,
int destinationIndex, int co...
EndsWith Method bool EndsWith(string value),
bool EndsWith(string value, System.StringCompari...
Equals Method bool Equals(System.Object obj),
bool Equals(string value), bool Equals(string...
--snip--
Length Property int Length {get;}
真不敢想象,一个简单的字符串对象竟然有这么多方法。字符串的成员有很多,这里只展示了其中一部分。一个对象有多少方法和属性取决于该对象所属的类。
也可以用点记法来引用方法。然而,与属性不同,方法名称后面始终有一对圆括号,并可以接受一个或多个参数。
假如想从
$color
变量中删除一个字符。你可以使用
Remove()
方法从字符串中删除字符。下面用代码清单2-21中的代码单独提取出
$color
的
Remove()
方法。
代码清单2-21
查看字符串的
Remove()
方法
PS> Get-Member -InputObject $color -Name Remove
Name MemberType Definition
---- ---------- ----------
Remove Method string Remove(int startIndex, int count), string Remove(int startIndex)
可以看到,该方法有两个定义。这意味着该方法有两种用法:同时提供
startIndex
参数和
count
参数,或者只提供
startIndex
参数。
如果想删除
$color
中的第二个字符,则需要指定从哪个位置开始,我们称之为
索引
。索引从0开始,因此第一个字母的索引是0,第二个字母的索引是1,以此类推。除了索引,还可以提供想删除的字符数量,两个参数之间用逗号隔开,如代码清单2-22所示。
代码清单2-22 调用方法
PS> $color.Remove(1,1)
Rd
PS> $color
red
这里索引是1,即让PowerShell从字符串中的第二个字符开始删除字符。第二个参数告诉PowerShell,只删除一个字符。因此,得到的结果为
Rd
。但注意,
Remove()
方法不会改变字符串变量的值。如果想保留修改结果,那么需要将
Remove()
方法的输出赋值给变量,如代码清单2-23所示。
代码清单2-23
捕获字符串上调用
Remove()
方法得到的输出
PS> $newColor = $color.Remove(1,1)
PS> $newColor
Rd
注意
如果想知道一个方法是返回一个对象(像
Remove()
方法那样)还是修改现有对象,可以查看方法的说明。从代码清单2-21可以看出,
Remove()
方法的定义前面有个
string
,这表明该方法会返回一个新字符串。如果前面是
void
,则通常表示修改现有对象,详见第6章。
这几个示例使用的都是最简单的对象类型,即字符串。下一节将介绍几个较复杂的对象。