ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-06-25 22:04:32  阅读:178  来源: 互联网

标签:脚本 对象 可以 System 命令 一个 方法 PowerShell 属性


对象=属性+方法

在现实世界中,你可能已经了解对象就是那些能够摸到的东西。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中的属性输出当前登录域、用户名、机器名:  

标签:脚本,对象,可以,System,命令,一个,方法,PowerShell,属性
来源: https://www.cnblogs.com/Ulysse/p/14932640.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有