初识 Powershell 5.0 class

简介:

过去豆子在PowerShell 里面处理自定义的对象一般都是通过hash表转换来的。今天看了看PS 5里面的class功能,发现这个功能实在是太好使了,如果有其他面向对象的开发语言的基础,很容易就上手了。


直接来看看例子吧。


比如我创建一个people的类。


注意要点:

  1. 格式

  2. 我通过static指定了一个静态的属性 $sex

  3. 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,如需转载请自行联系原作者

目录
相关文章
PowerShell 5.0和跨平台PowerShell支持class类编程
PowerShell 5.0和跨平台PowerShell支持class类编程 PowerShell 5.0支持class类编程,具体查看:https://technet.
1019 0
|
2月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
88 0
|
3月前
|
Windows
Powershell 重新排列去重 Windows环境变量
【9月更文挑战第13天】本文介绍如何使用PowerShell对Windows环境变量进行重新排列和去重。首先通过`$env:`访问环境变量,接着使用`-split`命令分割路径,再利用`Select-Object -Unique`去除重复项。之后可根据需要对路径进行排序,最后将处理后的路径组合并更新环境变量。注意修改环境变量前应备份重要数据并了解潜在影响。
144 10
|
7月前
|
存储 Ubuntu Linux
windows可以安装Ubuntu,ubuntu上也可以安装Powershell
powerhsell除了可以在windows上使用外,还可以在Ubuntu上部署开发环境。下面介绍Ubuntu上安装powershell的方法。
225 0
|
Shell Linux 开发工具
windows中cmd和PowerShell批处理命令
之前在 Git 批量删除本地分支,有用到 Linux 或 MacOS 下的批处理命令,这个命令中的 grep、xargs 本身是 Shell script,在 windows 中的 cmd 和 PowerShell 中是不能用的
114 0
|
JavaScript Windows
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
|
Windows
使用PowerShell获取Windows当前锁屏壁纸
使用PowerShell获取Windows当前锁屏壁纸 如果原始图片丢了,用这段代码就可以提取当前锁屏壁纸了!
199 0
|
应用服务中间件 nginx Windows
Windows PowerShell 中启动 Nginx 报错解决方案
Windows PowerShell 中启动 Nginx 报错解决方案
Windows PowerShell 中启动 Nginx 报错解决方案
|
XML 监控 数据格式
利用powershell进行windows日志分析
0x00 前言   Windows 中提供了 2 个分析事件日志的 PowerShell cmdlet:一个是Get-WinEvent,超级强大,但使用起来比较麻烦;另一个是Get-EventLog,使得起来相当简单,可以实时筛选,接下来,我们利用PowerShell 来自动筛选 Windows 事件日志。
2536 0