PowerShell命令与脚本(6)——对象

对象=属性+方法

在现实世界中,你可能已经了解对象就是那些能够摸到的东西。Powershell中的对象和现实生活很相似。例如要在现实生活中描述一把小刀。我们可能会分两方面描述它。 属性:一把小刀拥有一些特殊的属性,比如它的颜色、制造商、大小、刀片数。这个对象是红色的,重55克,有3个刀片,ABC公司生产的。因此属性描述了一个对象是什么。 方法:可以使用这个对象做什么,比如切东西、当螺丝钉用、开啤酒盖。一个对象能干什么就属于这个对象的方法。   1、创建对象 通过New-Object可以创建一个对象,甚至可以创建一个虚拟的小刀,但是第一步需要创建一个空对象。空对象什么都没有,如果调用它,不会返回任何东西。 PowerShell命令与脚本(6)——对象   2、增加属性 接下来描述这个对象是什么 PowerShell命令与脚本(6)——对象   3、增加方法 给一个对象增加了属性后,这个对象就有形状了,但是它仍然不能做任何事,要想它做事,必须给它增加方法。同样使用Add-Member,不过-memberType 选项使用ScriptMethod。 PowerShell命令与脚本(6)——对象 方法添加成功后就可以调用了 PowerShell命令与脚本(6)——对象 在调用方法时如果没有使用圆括号,方法不会执行,但是可以返回方法的基本信息。 PowerShell命令与脚本(6)——对象 到目前为止一个虚拟的小刀对象就创建完成了,一个对象包含数据(属性)和动作(方法)。  

属性:描述对象是什么

属性可以描述一个对象,对象的属性可以被Powershell自动转换成文本,并且输出到控制台。因此可以通过这种方法查看任何对象,例如$host: PowerShell命令与脚本(6)——对象 InternalHost对象存储在$host变量中,包含9个属性。输出的第一列为对象的属性,第二列为文本形式的属性值。例如要查看当前Powershell的版本号,可以访问$host对象的Version属性: PowerShell命令与脚本(6)——对象 由此可知,Version并不是以一串单独的数字存储的,它本身也是一个对象,包含 Major,Minor,Build,Revision四个属性,可以查看Version的具体类型,也可以访问它的每一个属性: PowerShell命令与脚本(6)——对象 查看一个对象的类型很实用,因为可以通过这个类型构造新的对象或者进行类型转换等等。 PowerShell命令与脚本(6)——对象 例如CurrentCulture属性,可以通过$host的CurrentCulture访问当前系统的本地化信息和该信息的类型: PowerShell命令与脚本(6)——对象 CurrentCulture包含3个属性,LCID, Name, and DisplayName。通过MSDN查看System.Globalization.CultureInfo的构造函数可知,可以将国家代码和国家名称标志字符串转换成一个新的CultureInfo对象。 PowerShell命令与脚本(6)——对象   属性中包含对象 一个对象的属性用来存储数据,反过来这些数据又可以存储其它对象。$host有两个比较特别的属性UI和PrivateData。把$host对象输出到控制台上后,除了UI和PrivateData所有的属性都会被转换成确定的文本: PowerShell命令与脚本(6)——对象 原因是这两个属性中又包含了一个对象: PowerShell命令与脚本(6)——对象 “RawUI” 为 “Raw User Interface” 提供了配置Powershell控制台用户界面的接口。上面的属性可以读取,但是个别却不能更改。   只读属性和读写属性 属性可以准确的描述对象,一旦属性更改了。这一更改也会体现在对象上。如果不能更改,属性就是“只读”属性。 通过简单地修改控制台的背景和前景的颜色,可以发现属性更改可以直接反映到对象上。 PowerShell命令与脚本(6)——对象 有的属性不能更改,如果尝试修改,就会抛出异常。 PowerShell命令与脚本(6)——对象 控制台是否接收到了一个按键请求,应当取决于用户的操作,因此该属性拒绝被更改,你只能读取它。   RawUI的属性 ForegroundColor:前景色 BackgroundColor:背景色 CursorPosition:光标的位置 WindowPosition:窗口的位置 CursorSize:光标的大小 BufferSize:缓冲区的大小 WindowSize:窗口的大小 MaxWindowSize:允许窗口的最大值 MaxPhysicalWindowSize:窗口可能的最大值 KeyAvailable:是否存在按键 WindowTitle:窗口的标题   属性的类型 有些属性只接受整数值,例如控制台光标的大小,值域在0-100,用来控制关闭大小的百分比。可以将光标设置为75%,但是不能超过100%,否则就会产生错误。 PowerShell命令与脚本(6)——对象 另一个属性ForegoundColor的类型为Color枚举值。因此给ForegoundColor所赋的值必须是已经在System.ConsoleColor中定义过的。可以将“Black”但是不能使用“Pink” `PowerShell命令与脚本(6)——对象 可以使用[System.Enum]::GetNames 方法查看ConsoleColor定义的所有颜色。 PowerShell命令与脚本(6)——对象 有时一个属性期望的赋值必须是一个指定类型的对象。例如WindowSize,如果想改变Powershell的窗口大小,可是设置WindowSize属性,但是它是一个System.Management.Automation.Host.Size对象,怎样获取这个对象呢? 1.先读取属性,保存为临时变量,更改临时变量,将临时变量赋给WindowSize 2.直接创建一个System.Management.Automation.Host.Size,赋给WindowSize PowerShell命令与脚本(6)——对象   查看所有属性 因为属性和方法都是对象的成员,可以使用Get-Member可以返回它们的成员的详细信息,如果只显示属性可以使用参数 MemberType 为“Property” PowerShell命令与脚本(6)——对象  

方法:对象能做什么

方法定义了一个对象可以做什么事情。当你把一个对象输出在控制台时,它的属性可能会被转换成可视的文本。但是它的方法却不可见。列出一个对象的所有方法可是使用Get-Member命令,给“MemeberType”参数 传入“Method”: PowerShell命令与脚本(6)——对象   过滤内部方法 Get-Memeber列出了一个对象定义的所有方法,但并不是所有的方法都有用,有些方法的的用处非常有限。   Get_ 和 Set_ 方法 所有名称以”get_”打头的方法都是为了给对应的属性返回一个值。例如”get_someInfo()”方法的作用就是返回属性someInfo的值,因此可以直接通过属性调用。 PowerShell命令与脚本(6)——对象 类似的象”set_someinfo”一样,该方法只是为了给属性someinfo赋值,可以直接通过属性赋值调用。如果一个对象中只有”get_someinfo”,没有对应的”set_someinfo”,说明someinfo这个属性为只读属性。   标准方法 几乎每个对象都有一些继承自父类的方法,这些方法并不是该对象所特有的方法,而是所有对象共有的方法。 Equals 比较两个对象是否相同 GetHashCode 返回一个对象的数字格式的指纹 GetType 返回一个对象的数据类型 ToString 将一个对象转换成可读的字符串 过滤包含了下划线的方法可是使用操作符 -notlike 和 通配符 * PowerShell命令与脚本(6)——对象   调用方法 一定要注意,在调用一个方法前,必须知道这个方法的功能。因为有的命令可能比较危险,例如错误地修改环境变量。调用一个方法,通过圆点加圆括号: $Host.GetType() ——调用带参数的方法 UI对象有很多实用的方法,可以通过get-member预览 PowerShell命令与脚本(6)——对象   ——哪一个参数是必须的 从列表中筛选出一个方法,再通过Get-Member得到更多的信息。 PowerShell命令与脚本(6)——对象 Definition属性告诉你怎样调用一个方法,每一个方法的定义都会返回一个Objec对象,System.Void 是一个特殊的类型,代表什么都没有,即返回值为空。 接下来就可以根据函数的定义,给它传进合适的参数调用了。 PowerShell命令与脚本(6)——对象   低级函数 上述的WriteDebugLine()函数并没有什么特别。事实上所谓的$Host中的很多方法只不过是一些简单的Cmdlets命令。例如使用如下cmdlet输出一条调试通知 PowerShell命令与脚本(6)——对象 上述的命令并没有输出黄色的调试信息,这和$DebugPreference配置有关,因为$DebugPreference的默认值为:SilentlyContinue。 当$DebugPreference为Stop,Continue,Inquire时就会输出调试消息: PowerShell命令与脚本(6)——对象 WriteErrorLine,WriteVerboseLine,WriteWarningLine的情况也类似。如果你不想受$DebugPreference配置的依赖,输出错误消息可以直接使用 $host.UI.WriteDebugLine()方法。   多个方法的签名 有些方法名相同,可以接受不同类型或者不同个数的参数,如何查看一个方法支持的所有签名 ,使用Get-Member获取方法对象,然后查看Definition属性。 PowerShell命令与脚本(6)——对象 但是Definition的输出阅读不方便,可是稍加润色。 PowerShell命令与脚本(6)——对象   创建选择菜单 这里需要使用$host.UI.PromptForChoice()方法,先查看方法的定义: PowerShell命令与脚本(6)——对象   下面的脚本演示如何创建选择菜单: 创建脚本文件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命令与脚本(6)——对象  

使用真实的对象工作

每一个Powershell命令都会返回一个对象,但是返回的对象不易操作,因为控制台解释器会自动将对象转换成可视的文本,这样就会丢失绝大多数对象的信息。 在变量中存储结果 不要将结果在控制台输出可以防止对象转换成文本。控制台是一个不安全的地方,任何对象输出后都会自动转换成文本,最安全的方式是将对象保存在变量中。如果想将对象输出为文本,可以在控制台输入变量名。 PowerShell命令与脚本(6)——对象 事实上述存储在$FileList变量中的并不是真实的对象,而是一个对象数组,数组可以通过索引访问得到真实的对象。 PowerShell命令与脚本(6)——对象   使用对象的属性 可以使用Get-Member得到一个对象所有的属性: PowerShell命令与脚本(6)——对象 如果属性的定义列中包含{get;set}表明该属性可以被更新: PowerShell命令与脚本(6)——对象   Powershell特殊属性 Powershell中 可以给一个对象增加属性,增加的属性仍然可以通过Get-Member的标签辨别,因为对象的正常属性标签名为:Property,新增加的属性标签多了一个前缀,如ScriptProperty和NoteProperty。 一个NoteProperty包含了静态的数据。一个ScriptProperty中包含了一段脚本,通过脚本计算出属性的值。 PowerShell命令与脚本(6)——对象 MemberType包括:
  • AliasProperty:另外一个属性的别名
  • CodeProperty:通过静态的.Net方法返回属性的内容
  • Property:真正的属性
  • NoteProperty:随后增加的属性
  • ScriptProperty:通过脚本执行返回一个属性的值
  • ParameterizedProperty:需要传递参数的属性
  调用对象的方法 同样可以通过Get-Memeber获得一个对象支持的所有方法: PowerShell命令与脚本(6)——对象 调用一个对象的方法时,省略括号可以获取一个方法的详细定义信息: PowerShell命令与脚本(6)——对象 调用对象的Delete方法: PowerShell命令与脚本(6)——对象   不同的方法类型 类似于属性,Powershell对象也可以增加方法,方法类型包括:
  • CodeMethod:映射到静态的.NET方法
  • Method:正常的方法
  • ScriptMethod:一个执行Powershell脚本的方法
   

调用静态方法

Powershell将信息存储在对象中,每个对象都会有一个具体的类型,简单的文本会以System.String类型存储,日期会以System.DateTime类型存储。任何.NET对象都可以通过GetType()方法返回它的类型,该类型中有一个FullName属性,可以查看类型的完整名称。 PowerShell命令与脚本(6)——对象 每一个类型都 可以包含一些静态的方法,可以通过方括号和类型名称得到类型对象本身,然后通过Get-Memeber命令查看该类型支持的所有静态方法。 PowerShell命令与脚本(6)——对象 System.DateTime类支持的静态方法非常实用 使用Parse方法将一个字符串转换成DateTime类: PowerShell命令与脚本(6)——对象 使用isLeapYear方法判断闰年 PowerShell命令与脚本(6)——对象 另一个常用的类为Math类,在Math类中定义了很多实用的静态方法: 例如求绝对值,三角函数,取整: PowerShell命令与脚本(6)——对象   查看感兴趣的.NET类型 .NET支持成千上万的类型,有了这些类型可以做许多事情,幸运的是Powershell恰好支持这些类型。 ——对象类型转换 例如使用System.Net.IPAddress类将字符串IP地址转换成一个IPAddress实例 PowerShell命令与脚本(6)——对象   调用静态的方法 同样是System.Net.IPAddress类,根据IP地址查看主机名,8.8.8.8是谷歌的免费DNS服务器 PowerShell命令与脚本(6)——对象   ——根据类型创建实例 下面演示通过webClient类的DownloadFile方法下载文件: PowerShell命令与脚本(6)——对象   查看程序集 .NET中的类型定义在不同的程序集中,首先得知道当前程序已经加载了那些程序集。AppDomain类可以完成这个需求,因为它有一个静态成员CurrentDomain,CurrentDomain中有一个GetAssemblies()方法。 PowerShell命令与脚本(6)——对象   搜索指定类型 System.Environment类可以做很多事情,可以先查看以下System.Environment类的所有静态方法。 PowerShell命令与脚本(6)——对象   例如System.Environment中的属性输出当前登录域、用户名、机器名: PowerShell命令与脚本(6)——对象  
上一篇:PowerShell命令与脚本(8)——循环


下一篇:PowerShell工具之Powerup详解实录