过去豆子在PowerShell 里面处理自定义的对象一般都是通过hash表转换来的。今天看了看PS 5里面的class功能,发现这个功能实在是太好使了,如果有其他面向对象的开发语言的基础,很容易就上手了。
直接来看看例子吧。
比如我创建一个people的类。
注意要点:
-
格式
-
我通过static指定了一个静态的属性 $sex
-
Enum是PS5的另外一个很nb的功能,可以自己创建一个枚举类,然后这个类的实例只能在限定的范围里面出现;比如 nationality(国籍)只能是我指定的那几个国家名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Class people
{
[string]
$name
[int]
$age
static
[string]
$sex
=
'male'
[string]
$career
[nationality]
$nationality
}
Enum nationality
{
China = 1
Japan = 2
Australia = 3
USA = 4
Russia = 5
}
|
创建好类了,我们需要实例化。这里有2种方式实例化,第一种是和传统的方式一样,New-Object实现,然后挨个给每个实例的属性赋值
1
2
3
4
5
6
7
|
$obj
=
new-object
people
$obj
.name=
'alex'
$obj
.age=20
$obj
.career=
'IT'
$obj
.nationality=
'china'
$obj
::sex
$obj
|
结果如下所示,注意他的类的静态成员只能通过::的方式显示出来,而不会显示在实例对象的属性里面
1
2
3
4
|
male
name age career nationality
---- --- ------ -----------
alex 20 IT China
|
第二个实例化的方式是通过new()这个构造函数来实例化,他和第一种的区别主要在于第一种方式还可以在初始化的同时通过-property指定属性,但是new()默认的构造方法只能通过=来给属性赋值
1
2
3
4
5
6
|
$obj2
=
[people]
::new()
$obj2
.name=
'james'
$obj2
$obj3
=
new-object
people -Property @{
'name'
=
'kevin'
;
'age'
=30;
'career'
=
'Chef'
;
'nationality'
=
'Japan'
}
$obj3
|
如果一定要在new()实例化的时候一起赋值,我们可以手动重写一个构造函数
比如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
Class people
{
[string]
$name
[int]
$age
static
[string]
$sex
=
'male'
[string]
$career
[nationality]
$nationality
people(
$name
,
$age
,
$career
,
$nationalty
){
$this
.name=
$name
$this
.age=
$age
$this
.career=
$career
$this
.nationality=
$nationalty
}
}
Enum nationality
{
China = 1
Japan = 2
Australia = 3
USA = 4
Russia = 5
}
$user
=
[people]
::new(
'zhangsan'
,22,
'receptionist'
,
'china'
)
$user
-------
name age career nationality
---- --- ------ -----------
zhangsan 22 receptionist China
|
然后简单的看一下类的继承
继承关系通过:实现。
比如我创建一个子类 immigrant,继承people,子类里面可以定义新的属性
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class immigrant : people
{
[nationality]
$destination
}
$immi
=
New-Object
immigrant -Property @{
'name'
=
'qq'
;
'age'
=30;
'career'
=
'dancer'
;
'nationality'
=
'Japan'
;
'destination'
=
'USA'
}
$immi
------------
PS C:\Windows\system32>
$immi
destination : USA
name : qq
age : 30
career : dancer
nationality : Japan
|
最后把面向过程和面向对象做个简单的对比
首先是传统的方式,通过hash表转为自定义的对象,这种开发思路应该是面向过程的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Function
Get-SystemInfo
{
[
cmdletbinding
()]
param
(
[string[]]
$ComputerName
)
begin
{}
process
{
$result
=@()
foreach
(
$computer
in
$ComputerName
){
try{
write-verbose
"Querying OS and Computer System"
$os
=
Get-WmiObject
-Class win32_operatingsystem -ErrorAction Stop
$cs
=
Get-WmiObject
-Class win32_computersystem -ErrorAction Stop
}catch{
$computer
|out
-file
c:\temp\error.txt -Append
}
$prop
=@{ComputerName=
$computer
;LastBootTime=
$os
.ConvertToDateTime(
$os
.LastBootUpTime);OSVersion=
$os
.Version;Manufacture=
$cs
.Manufacturer;Model=
$cs
.model}
$obj
=
New-Object
-TypeName psobject -property
$prop
$obj
.psobject.typenames.insert(0,
'Yuan.systeminfo'
)
write-output
$obj
}
}
end
{}
}
Get-SystemInfo
-ComputerName sydav01
|
然后我用面向对象的思路也写了个同样的功能,创建类,类里面封装字段和方法,然后实例化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class sysinfo
{
[string]
$model
[string]
$computername
[string]
$manufacture
[string]
$lastboottime
[string]
$osversion
getinfo(
$computername
){
$os
=
Get-WmiObject
-computername
$computername
-Class win32_operatingsystem -ErrorAction Stop
$cs
=
Get-WmiObject
-computername
$computername
-Class win32_computersystem -ErrorAction Stop
$this
.LastBootTime=
$os
.ConvertToDateTime(
$os
.LastBootUpTime);
$this
.OSVersion=
$os
.Version;
$this
.Manufacture=
$cs
.Manufacturer;
$this
.Model=
$cs
.model
}
}
$obj
=
New-Object
sysinfo
$obj
.computername=
'sydav01'
$obj
.getinfo(
$obj
.computername)
$obj
|
他们的结果都是一样的
1
2
3
4
5
|
Model : VMware7,1
ComputerName : sydav01
Manufacture : VMware, Inc.
LastBootTime : 7/11/2016 10:03:56 AM
OSVersion : 6.3.9600
|
豆子只是简单简简单单地了解了一下powershell 5 class的基本使用。类的三大特性,封装,继承和多态,Powershell 5具体实现了哪些特性还需要慢慢尝试。
本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1878424,如需转载请自行联系原作者