对象=属性+方法
在现实世界中,你可能已经了解对象就是那些能够摸到的东西。Powershell中的对象和现实生活很相似。例如要在现实生活中描述一把小刀。我们可能会分两方面描述它。
属性:一把小刀拥有一些特殊的属性,比如它的颜色、制造商、大小、刀片数。这个对象是红色的,重55克,有3个刀片,ABC公司生产的。因此属性描述了一个对象是什么。
方法:可以使用这个对象做什么,比如切东西、当螺丝钉用、开啤酒盖。一个对象能干什么就属于这个对象的方法。
1、创建对象
通过New-Object可以创建一个对象,甚至可以创建一个虚拟的小刀,但是第一步需要创建一个空对象。空对象什么都没有,如果调用它,不会返回任何东西。
2、增加属性
接下来描述这个对象是什么
3、增加方法
给一个对象增加了属性后,这个对象就有形状了,但是它仍然不能做任何事,要想它做事,必须给它增加方法。同样使用Add-Member,不过-memberType 选项使用ScriptMethod。
方法添加成功后就可以调用了
在调用方法时如果没有使用圆括号,方法不会执行,但是可以返回方法的基本信息。
到目前为止一个虚拟的小刀对象就创建完成了,一个对象包含数据(属性)和动作(方法)。
属性:描述对象是什么
属性可以描述一个对象,对象的属性可以被Powershell自动转换成文本,并且输出到控制台。因此可以通过这种方法查看任何对象,例如$host:
InternalHost对象存储在$host变量中,包含9个属性。输出的第一列为对象的属性,第二列为文本形式的属性值。例如要查看当前Powershell的版本号,可以访问$host对象的Version属性:
由此可知,Version并不是以一串单独的数字存储的,它本身也是一个对象,包含 Major,Minor,Build,Revision四个属性,可以查看Version的具体类型,也可以访问它的每一个属性:
查看一个对象的类型很实用,因为可以通过这个类型构造新的对象或者进行类型转换等等。
例如CurrentCulture属性,可以通过$host的CurrentCulture访问当前系统的本地化信息和该信息的类型:
CurrentCulture包含3个属性,LCID, Name, and DisplayName。通过MSDN查看System.Globalization.CultureInfo的构造函数可知,可以将国家代码和国家名称标志字符串转换成一个新的CultureInfo对象。
属性中包含对象
一个对象的属性用来存储数据,反过来这些数据又可以存储其它对象。$host有两个比较特别的属性UI和PrivateData。把$host对象输出到控制台上后,除了UI和PrivateData所有的属性都会被转换成确定的文本:
原因是这两个属性中又包含了一个对象:
“RawUI” 为 “Raw User Interface” 提供了配置Powershell控制台用户界面的接口。上面的属性可以读取,但是个别却不能更改。
只读属性和读写属性
属性可以准确的描述对象,一旦属性更改了。这一更改也会体现在对象上。如果不能更改,属性就是“只读”属性。
通过简单地修改控制台的背景和前景的颜色,可以发现属性更改可以直接反映到对象上。
有的属性不能更改,如果尝试修改,就会抛出异常。
控制台是否接收到了一个按键请求,应当取决于用户的操作,因此该属性拒绝被更改,你只能读取它。
RawUI的属性
ForegroundColor:前景色
BackgroundColor:背景色
CursorPosition:光标的位置
WindowPosition:窗口的位置
CursorSize:光标的大小
BufferSize:缓冲区的大小
WindowSize:窗口的大小
MaxWindowSize:允许窗口的最大值
MaxPhysicalWindowSize:窗口可能的最大值
KeyAvailable:是否存在按键
WindowTitle:窗口的标题
属性的类型
有些属性只接受整数值,例如控制台光标的大小,值域在0-100,用来控制关闭大小的百分比。可以将光标设置为75%,但是不能超过100%,否则就会产生错误。
另一个属性ForegoundColor的类型为Color枚举值。因此给ForegoundColor所赋的值必须是已经在System.ConsoleColor中定义过的。可以将“Black”但是不能使用“Pink”
`
可以使用[System.Enum]::GetNames 方法查看ConsoleColor定义的所有颜色。
有时一个属性期望的赋值必须是一个指定类型的对象。例如WindowSize,如果想改变Powershell的窗口大小,可是设置WindowSize属性,但是它是一个System.Management.Automation.Host.Size对象,怎样获取这个对象呢?
1.先读取属性,保存为临时变量,更改临时变量,将临时变量赋给WindowSize
2.直接创建一个System.Management.Automation.Host.Size,赋给WindowSize
查看所有属性
因为属性和方法都是对象的成员,可以使用Get-Member可以返回它们的成员的详细信息,如果只显示属性可以使用参数 MemberType 为“Property”
方法:对象能做什么
方法定义了一个对象可以做什么事情。当你把一个对象输出在控制台时,它的属性可能会被转换成可视的文本。但是它的方法却不可见。列出一个对象的所有方法可是使用Get-Member命令,给“MemeberType”参数 传入“Method”:
过滤内部方法
Get-Memeber列出了一个对象定义的所有方法,但并不是所有的方法都有用,有些方法的的用处非常有限。
Get_ 和 Set_ 方法
所有名称以”get_”打头的方法都是为了给对应的属性返回一个值。例如”get_someInfo()”方法的作用就是返回属性someInfo的值,因此可以直接通过属性调用。
类似的象”set_someinfo”一样,该方法只是为了给属性someinfo赋值,可以直接通过属性赋值调用。如果一个对象中只有”get_someinfo”,没有对应的”set_someinfo”,说明someinfo这个属性为只读属性。
标准方法
几乎每个对象都有一些继承自父类的方法,这些方法并不是该对象所特有的方法,而是所有对象共有的方法。
Equals 比较两个对象是否相同
GetHashCode 返回一个对象的数字格式的指纹
GetType 返回一个对象的数据类型
ToString 将一个对象转换成可读的字符串
过滤包含了下划线的方法可是使用操作符 -notlike 和 通配符 *
调用方法
一定要注意,在调用一个方法前,必须知道这个方法的功能。因为有的命令可能比较危险,例如错误地修改环境变量。调用一个方法,通过圆点加圆括号:
$Host.GetType()
——调用带参数的方法
UI对象有很多实用的方法,可以通过get-member预览
——哪一个参数是必须的
从列表中筛选出一个方法,再通过Get-Member得到更多的信息。
Definition属性告诉你怎样调用一个方法,每一个方法的定义都会返回一个Objec对象,System.Void 是一个特殊的类型,代表什么都没有,即返回值为空。
接下来就可以根据函数的定义,给它传进合适的参数调用了。
低级函数
上述的WriteDebugLine()函数并没有什么特别。事实上所谓的$Host中的很多方法只不过是一些简单的Cmdlets命令。例如使用如下cmdlet输出一条调试通知
上述的命令并没有输出黄色的调试信息,这和$DebugPreference配置有关,因为$DebugPreference的默认值为:SilentlyContinue。
当$DebugPreference为Stop,Continue,Inquire时就会输出调试消息:
WriteErrorLine,WriteVerboseLine,WriteWarningLine的情况也类似。如果你不想受$DebugPreference配置的依赖,输出错误消息可以直接使用 $host.UI.WriteDebugLine()方法。
多个方法的签名
有些方法名相同,可以接受不同类型或者不同个数的参数,如何查看一个方法支持的所有签名 ,使用Get-Member获取方法对象,然后查看Definition属性。
但是Definition的输出阅读不方便,可是稍加润色。
创建选择菜单
这里需要使用$host.UI.PromptForChoice()方法,先查看方法的定义:
下面的脚本演示如何创建选择菜单:
创建脚本文件test.ps1
$SwitchUser=([System.Management.Automation.Host.ChoiceDescription]"&Switchuser")
$LoginOff=([System.Management.Automation.Host.ChoiceDescription]"&LoginOff")
$Lock=([System.Management.Automation.Host.ChoiceDescription]"&Lock")
$Reboot=([System.Management.Automation.Host.ChoiceDescription]"&Reboot")
$Sleep=([System.Management.Automation.Host.ChoiceDescription]"&Sleep")
$selection=[System.Management.Automation.Host.ChoiceDescription[]]($SwitchUser,$LoginOff,$Lock,$Reboot,$Sleep)
$answer=$Host.UI.PromptForChoice('接下来我们做什么呢?','请选择',$selection,1)
"您的选择是:"
switch($answer)
{
0 {"切换用户"}
1 {"注销"}
2 {"锁定"}
3 {"重启"}
4 {"休眠"}
}
使用真实的对象工作
每一个Powershell命令都会返回一个对象,但是返回的对象不易操作,因为控制台解释器会自动将对象转换成可视的文本,这样就会丢失绝大多数对象的信息。
在变量中存储结果
不要将结果在控制台输出可以防止对象转换成文本。控制台是一个不安全的地方,任何对象输出后都会自动转换成文本,最安全的方式是将对象保存在变量中。如果想将对象输出为文本,可以在控制台输入变量名。
事实上述存储在$FileList变量中的并不是真实的对象,而是一个对象数组,数组可以通过索引访问得到真实的对象。
使用对象的属性
可以使用Get-Member得到一个对象所有的属性:
如果属性的定义列中包含{get;set}表明该属性可以被更新:
Powershell特殊属性
Powershell中 可以给一个对象增加属性,增加的属性仍然可以通过Get-Member的标签辨别,因为对象的正常属性标签名为:Property,新增加的属性标签多了一个前缀,如ScriptProperty和NoteProperty。
一个NoteProperty包含了静态的数据。一个ScriptProperty中包含了一段脚本,通过脚本计算出属性的值。
MemberType包括:
- AliasProperty:另外一个属性的别名
- CodeProperty:通过静态的.Net方法返回属性的内容
- Property:真正的属性
- NoteProperty:随后增加的属性
- ScriptProperty:通过脚本执行返回一个属性的值
- ParameterizedProperty:需要传递参数的属性
调用对象的方法
同样可以通过Get-Memeber获得一个对象支持的所有方法:
调用一个对象的方法时,省略括号可以获取一个方法的详细定义信息:
调用对象的Delete方法:
不同的方法类型
类似于属性,Powershell对象也可以增加方法,方法类型包括:
- CodeMethod:映射到静态的.NET方法
- Method:正常的方法
- ScriptMethod:一个执行Powershell脚本的方法
调用静态方法
Powershell将信息存储在对象中,每个对象都会有一个具体的类型,简单的文本会以System.String类型存储,日期会以System.DateTime类型存储。任何.NET对象都可以通过GetType()方法返回它的类型,该类型中有一个FullName属性,可以查看类型的完整名称。
每一个类型都 可以包含一些静态的方法,可以通过方括号和类型名称得到类型对象本身,然后通过Get-Memeber命令查看该类型支持的所有静态方法。
System.DateTime类支持的静态方法非常实用
使用Parse方法将一个字符串转换成DateTime类:
使用isLeapYear方法判断闰年
另一个常用的类为Math类,在Math类中定义了很多实用的静态方法:
例如求绝对值,三角函数,取整:
查看感兴趣的.NET类型
.NET支持成千上万的类型,有了这些类型可以做许多事情,幸运的是Powershell恰好支持这些类型。
——对象类型转换
例如使用System.Net.IPAddress类将字符串IP地址转换成一个IPAddress实例
调用静态的方法
同样是System.Net.IPAddress类,根据IP地址查看主机名,8.8.8.8是谷歌的免费DNS服务器
——根据类型创建实例
下面演示通过webClient类的DownloadFile方法下载文件:
查看程序集
.NET中的类型定义在不同的程序集中,首先得知道当前程序已经加载了那些程序集。AppDomain类可以完成这个需求,因为它有一个静态成员CurrentDomain,CurrentDomain中有一个GetAssemblies()方法。
搜索指定类型
System.Environment类可以做很多事情,可以先查看以下System.Environment类的所有静态方法。
例如System.Environment中的属性输出当前登录域、用户名、机器名: