PowerShell语言允许通过一个字面类型(type Literals)来访问类型,它是用括号抬起的类型名,返回.NET底层的System.Type对象实例,如:

PS C:\> [System.Int32]IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueTypePS C:\> [System.String]IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.ObjectPS C:\> [System.Diagnostics.Process]IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Process                                  System.ComponentM...System.ComponentM...

不必在任何情况下都重复System命名空间的前缀,这时因为所用的大多数类型都在命名空间下。PowerShell允许省略这个前缀,如:

PS C:\> [Diagnostics.Process]IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Process                                  System.ComponentM...
为了方便,我们定义了如下常用类型别名。
(1)int、short和long:分别参考System.Int32、System.Int16和Sytem.Int64类型。
(2)byte和sbyte:对应无符号的System.Int32和有符号的System.SByte类型。
(3)void:对应没有类型。
(4)string:对应System.String类型。
(5)float和single:对应System.Single而double对应于Sytem.Double类型。
(6)decimal:对应System.Decimal的类型。
(7)regex:对应System.Text.RegularExpressions.Regex。
(8)adsi:对应System.DirectoryServices.DirectoryEntry。
(9)wmi、wmiclass和wmisearcher:分别对应System.Management.
ManagementObject、System.Management.
ManagementClass和System.ManagementObjectSearcher。

不需要记忆任何别名的含义,可以查询,如:

PS C:\> ([regex]).Fullname
System.Text.RegularExpressions.Regex
PS C:\> ([adsi]).Fullname
System.DirectoryServices.DirectoryEntry
PS C:\> ([wmisearcher]).Fullname
System.Management.ManagementObjectSearcher
PS C:\> ([wmi]).Fullname
System.Management.ManagementObject

类型转换

在原始对象前面放置字面类型,通常字面类型会通知Shell完成对象类型的转换。如果正确,将返回一个新的对象。下例将字符串转换为整型:

PS C:\> $str="10"
PS C:\> $str.GetType().FullName
System.String
PS C:\> $Num=[int]$str
PS C:\> $Num
10
PS C:\> $Num.GetType().FullName
System.Int32

如果字符串本身可以转换,转换很方便;否则将会出错。下例在转换出错时抛出异常:

PS C:\> [int] "not a integer string" 
Cannot convert value "not a integer string" to type "System.Int32". 
Error: "输入字符串的格式不正确。"  
At line:1 char:6 + [int] <<<< "not a integer string"

PowerShell主要依靠.NET框架类型转换机制并为开发人员提供了方便的类型转换工具,处理类型转换任务的策略如下。

(1)检查是否可以从旧类型转换到新类型,如果在.NET中可以实现,类型必须相同或其中一个直接或者间接继承。

(2)如果类型间转换已经被内置到语言中,PowerShell会尝试使用这些方法。

(3)查找TypeConverter或PSTypeConverter相关类,前者是.NET内置的类型转换机制;后者是PowerShell特定的类型转换对象。二者均通过用正确的.NET属性标记目标自定义类、关联目标类型和编译类型类。很多现在.NET类已与类型转换器关联,PowerShell能够将这些类无缝地在类型间转换。另外,可以在Shell扩展类型系统的配置文件中将类型与类型转换器关联起来。

(4)尝试从原始对象转换到字符串类型,通过调用目标对象类型的Parse()方法从字符串类型转换到目标类型。

(5)查找可以接受原始类型对象的新类型结构体,如果找到,则用其构造新对象。

(6)搜索两种对象类型的显式或隐式转换操作符,适当的操作符会被编译成分别以op_Explicit和op_Implicit命名的显示和隐式静态方法。如果找到了合适的方法,将会调用该方法转换并返回对象。

(7)检查原始类型是否已经执行.NET的IConvertible接口,如果执行,类型能够转换为诸如int、double及decimal之类的基础类型。

PowerShell的内置类型转换规则如下。

(1)每一个对象能够被转换为PSObject,PowerShell会自动执行这个操作。大部分情况下没有参考对象,但是使用指向实际对象的PSObject实例。

(2)void被转换为转换$null,如:

PS C:\> ([void] 5) -eq $null
True

(3)可以把所有的对象和集合类型转换为数组,这里的集合被定义为执行ICollextion接口的.NET类型。.NET框架有多个内置集合类,而且集合类通过开发人员调用接口来执行。这意味着我们能够把任何的集合转换为数组,如:

PS C:\> ([object[]] 5).GetType().FullName
System.Object[]
PS C:\> $string = New-Object Collections.Specialized.StringCollection
PS C:\> ([object[]] $string).GetType().FullName
System.Object[]

(4)可以按照任何非空和非null对象为真的方式把所有对象转换为Boolean类型。

(5)所有对象能够被转换为string类型。

(6)IDictionary对象能够转换为哈希表,.NET框架中的IDictionary接口被拥有一系列键-值映射的对象来执行。哈希表类经常被用在字典对象中,下例从OrderedDictionary对象转换到哈希表:

PS C:\> $dict=New-Object Collections.Specialized.OrderedDictionary
PS C:\> $dict["item1"]=3
PS C:\> $hash=[Hashtable] $dict
PS C:\> $hashName                           Value
----                           -----
item1                          3PS C:\> $hash.GetType().FullName
System.Collections.Hashtable
PS C:\> $dict.GetType().FullName
System.Collections.Specialized.OrderedDictionary

把变量转换为RSReference时需要创建一个指向原型的基准变量,修改基准值即修改原型,如:

PS C:\> $a=3
PS C:\> $b=[ref]$a
PS C:\> $b.Value=4
PS C:\> $b.Value
4
PS C:\> $a
4

我们将会在第7章中详细介绍。

(7)适当格式的字符串可以被转换为XML文档,如:

PS C:\> $doc=[xml] "<root><item>2</item></root>"
PS C:\> $doc.root.item
2

(8)脚本块可以转换为.NET的委派委派是指向方法或脚本块的对象类型,通常会作用于对象触发事件处理代码。使用可触发事件的.NET类型时,通常需要把脚本块转换为委派。

在从包含名称、路径或查询字符串转换时,对象能够被创建和获取。

(9)字符串转换为字符数组,如:

PS C:\> [char[]] "Chars"
C
h
a
r
s

(10)字符串可以转换为正则表达式,这时字符串被作为匹配模式,如:

PS C:\> ([regex] "a.*?b").GetType().FullName
System.Text.RegularExpressions.Regex

(11)字符串可以创建WMI对象(参见第22章),如:

PS C:\> [wmisearcher] 'select * from Win32_Process'
Scope     : System.Management.ManagementScope
Query     : System.Management.ObjectQuery
Options   : System.Management.EnumerationOptions
Site      :
Container :PS C:\> [WMI]'\\.\root\cimv2:Win32_Process.Handle=0'
……
Description                : System Idle Process
……PS C:\> ([wmiclass] "Win32_Share").GetType().FullName
System.Management.ManagementClass

(12)字符串可以转换为活动目录实例,转换进程使用字符串作为DircetoryEntry路径。下例使用PSBase替代适配器视图获取真实的对象类型:

PS C:\> $user=[ADSI]"WinNT://./Server,admin"
PS C:\> $user.PSBase.GetType().FullName
System.DirectoryServices.DirectoryEntry

(13)字符串可以指向.NET类型,输入字符串被作为类型名,同样可以省略System命名空间前缀,如:

PS C:\> [type] "System.Diagnostics.Process"IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Process                                  System.ComponentM...PS C:\> [type] "Diagnostics.Process"IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Process                                  System.ComponentM...

访问静态成员

字面类型可以用于访问静态属性和方法,为此使用双冒号(::)来分割字面类型和成员名。下例获取一个静态属性值:

PS C:\> [datetime]::Today2008年12月16日 0:00:00

调用静态方法与此类似,下例调用Parse方法创建double对象:

PS C:\> [double]::Parse("2.5")

2.5

总 结

PowerShell作为强大且复杂的语言,并没有过于严格或对新手不友好。因为它把所有的对象类型通过适配器和扩展统一存取,所以用户能够找到快速入手的途径。最常用的对象是获取实体扩展,从而提高了脚本编写者的创造性,并降低了学习的难度。

在需要时类型扩展系统在引擎中转换对象,从而节省了宝贵的时间并增加了脚本的可读性。所有这一切使得PowerShell带有.NET和Windows的原始动力,成为强大的混类脚本语言。

赛迪网地址:http://tech.ccidnet.com/art/33093/20100610/2082895_1.html

作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu

转载于:https://www.cnblogs.com/fuhj02/archive/2010/11/17/1879408.html

Windows PowerShell 2.0语言之字面类型系统相关推荐

  1. Windows PowerShell 2.0语言开发之脚本块

    脚本块是重要的编程结构,是PowerShell重要的摘要和重用代码的机制,学习脚本块的最终目标是掌握各种重用代码的方法,如别名程序提供和脚本文件.这些技术都很重要,因为它们是逐步创建复杂脚本的基础. ...

  2. Windows PowerShell 2.0语言的内置类型系统

    PowerShell不仅允许用户操作各种类型的对象,而且可以通过统一方式来修改这些类型.当然也包括内置类型,这样可以更贴近日常工作中用到的对象类型.PowerShell的类型在很大程度上依靠.NET框 ...

  3. xp,windows2003卸载Windows PowerShell 1.0

    网上说:Windows XP-SP2和Windows Server 2003:在添加/移除程序中,选择显示更新.删除适用于您系统的PowerShell更新: KB926139 (en-us),KB92 ...

  4. 抢先体验 Windows PowerShell 2.0 全新技术

    Windows PowerShell(下简称"PowerShell")是微软公司为Windows环境所开发的Shell及脚本语言技术,采用命令行界面.第1个版本于2006年第4季度 ...

  5. Windows PowerShell 1.0 正式版微软官方下载全地址

    Download PowerShell 1.0正式版 微软官方下载 地址全家福 Windows Vista x86: http://download.microsoft.com/download/4/ ...

  6. Windows PowerShell 2.0创建调用脚本文件

    在PowerShell中不存在文件和目录的概念,涉及文件和目录的操作总是转换为项(item)处理,即Get-Item.Get-ChildItem和Get-ItemProperty.在PowerShel ...

  7. win7禁用powershell_简述Windows 7中的Windows PowerShell功能

    Win7之家( www.win7china.com):简述Windows 7中的Windows PowerShell功能 也许有人会问,这么多的Windows版本过去了,命令提示符怎么还是那样啊?以前 ...

  8. 易学易用的Windows PowerShell(转)

    出处:http://www.cnblogs.com/shanyou/archive/2007/02/12/648204.html Windows PowerShell 是微软为 Windows 环境所 ...

  9. Windows PowerShell™ 用户手册(zz)

    Windows PowerShell™ 用户手册 Microsoft Corporation 发布日期:2006 年 9 月 摘要 Windows PowerShell™ 是专为系统管理员设计的新 W ...

最新文章

  1. Overleaf-LaTex表格制作
  2. js委托事件-addEventListeners(冒泡方向)
  3. Mysql数据库常用操作整理
  4. Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题
  5. Crawler:基于Crawler和P2P技术实现机器人智能在线下载
  6. SAP APO 介绍
  7. js获取单选按钮的值
  8. Java 8实战 第一章笔记
  9. C#中BackgroundWorker的介绍
  10. python使用redis做缓存_python实现类redis缓存
  11. 我讨厌电脑!一个系统管理员的自白
  12. FFmpeg之获取yuv分量(二十二)
  13. 关于erlang的-run 的启动参数
  14. 地理图例大全整理初中
  15. windirstat这个软件可以图形化统计磁盘占用,实用!
  16. Math数学对象(万能随机数公式)
  17. ROS实验笔记之——JCV-450无人机初入门
  18. p坚持csma协议 仿真‘_签了“三方协议”,还算应届毕业生吗!?
  19. Problem A. Snapper Chain 问题A.按扣链条 解决办法
  20. Kafka高性能之页缓存(page cache)使用

热门文章

  1. Linux kernel futex.c的bug导致JVM不可用
  2. Python3中装饰器@typing.overload的使用
  3. Conan客户端简单使用示例
  4. OpenCV中Mat数据结构使用举例
  5. matlab内存管理(二)
  6. 【Go】Go基础(十):文件读写
  7. JQ 全选后获取选中的值_为什么在PBI中还需要切片器之三:Excel切片器之度量值切换...
  8. Java项目:房屋租赁系统设计和实现(java+ssm+mysql+spring+jsp)
  9. c语言动态迁移mysql,flask-migrate动态迁移数据库
  10. python123第k序元素查找_Python实现折半查找并用matplotlib实现动态过程可视化