当前位置: 首页 > 编程日记 > 正文

Windows PowerShell 2.0语言之字面类型系统

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

相关文章:

建立名称server

一、实验的目的&#xff1a;实现DNSserver功能&#xff0c;提供正向、反向解析二、实验环境装有Linux的Windows系统IP为192.168.6.3的虚拟机三、实验目的建立gr.org域的主名称server。解析&#xff1a;名称 IP 用途ns.gr.org 192.168.…

Java的JSON操作存储List到Redis

使用jackson和json-lib都可以 <dependency> <groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>net.sf.json-li…

关注基于云的下一代应用开发

接受经济和信息化的视频专访专访的主页地址为&#xff1a;http://www.enicn.com/article/2010-08-20/0R064b52010.shtml我的其他视频&#xff0c;请参考土豆空间&#xff0c;地址为http://www.tudou.com/home/larryvmw。

确认了!MySQL 狠甩 Oracle 稳居 Top1!

01几乎所有程序员都会用到的 MySQL稳居 Top 1科技长河&#xff0c;顺之者昌&#xff0c;错失者亡。在2019年&#xff0c;CSDN面向具备超强计算力的数字化世界&#xff0c;我们进行了「大数据技术应用现状分析」&#xff0c;并发布了《2019-2020 年中国开发者调查报告》。发现&a…

[AWK]使用AWK进行分割字符串以及截取字符串

如何split当前的字符串&#xff0c;用$0&#xff0c;例如&#xff1a; cat num.2012032911 | awk {print $2} | awk {split($0,b,".");print b[2]} | cut -c 3- 获取第二列&#xff0c;例如第二列是com.sb3456.you那么在split当前的这个字符串获得sb3456,最后截取sb3…

SpringMVC集成Tiles布局引擎框架

Tiles布局框架&#xff0c; http://tiles.apache.org/ Spring已经对Tiles进行了集成。页头页尾公共模板页要靠这个&#xff0c;不然重复代码太多。 <dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-servlet</artifactId><…

VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)

右击项目->属性->字符集&#xff1a;使用多字节字符集。这样可以使用char到CString的转化。char sRead[20] ""; CString strtest sRead; 大气象 //文件查找/*CString strFileTitle;CFileFind finder;BOOL bWorking finder.FindFile(_T("C:\*.sys"…

程序员会懂的冷笑话:各大编程语言的内心独白

作者 | Anupam Chugh译者 | 弯月&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;软件工程领域鱼龙混杂。有些人乐不思蜀&#xff0c;而有些人则饱受打击。然而&#xff0c;构建软件的工作让每个人倍感压力&#xff0c;这点毋庸置疑。在本文…

swift集成alamofire的简单封装

import UIKit import Alamofire enum MethodType{ case GET case POST } class NetworkTool: NSObject { class func request(type : MethodType ,urlString : String , paramters: [String :Any]? nil,finishedCallback : escaping (_ result : Any) -> ()) { //判断是什…

Go后台项目架构思考与重构 | 深度长文

作者 | 腾讯云后台工程师黄雷编辑 | 唐小引来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;引言本文首先介绍了架构的重要性&#xff0c;随后从一个实际项目的重构过程作为主线&#xff0c;逐步引出主流的架构设计思想以及其所解决的实际问题是什么。通过阅读本文&…

前途到底是网络工程还是程序设计

本人89年年底生的&#xff0c;现在快满21了&#xff0c;大二的时候过的国家网络工程师考试&#xff0c;并不是cisco的网络支持工程师&#xff0c;大三也就是现在&#xff0c;在学校花销太大&#xff0c;想自己赚点钱&#xff0c;于是在学校招聘会上应聘了一家通信公司&#xff…

FAIL - Deployed application at context path / but context failed to start

IDE报错&#xff1a;FAIL - Deployed application at context path / but context failed to start 编译通过&#xff0c;这个错误原因是很多地方被误用&#xff0c;导致Spring运行时不能解析某些Class导致&#xff0c; 例如&#xff1a;ModelAndView用错 public ModelAndView…

项目ITP(五) spring4.0 整合 Quartz 实现任务调度

2014-05-16 22:51 by Jeff Li 前言 系列文章&#xff1a;[传送门] 项目需求&#xff1a; 二维码推送到一体机上&#xff0c;给学生签到扫描用。然后须要的是 上课前20分钟 。幸好在帮带我的学长做 p2p 的时候。接触过。自然 quartz 是首选。所以我就配置了下&#xff0c;搞了个…

Spring security防止跨站请求伪造(CSRF防护)

因为使用了spring security 安全性框架 所以spring security 会自动拦截站点所有状态变化的请求&#xff08;非GET,HEAD,OPTIONS和TRACE的请求&#xff09;&#xff0c;防止跨站请求伪造&#xff08;CSRF防护&#xff09;&#xff0c;即防止其他网站或是程序POST等请求本站点。…

从Ops到NoOps,阿里文娱智能运维的关键:自动化应用容量管理

作者| 阿里文娱高级开发工程师 金呈编辑 | 夕颜来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;概述1. 背景随着业务形态发展&#xff0c;更多的生产力集中到业务创新&#xff0c;这背后要求研发能力的不断升级。阿里文娱持续倾向用更加高效、稳定、低成本的方式支…

JAVA目录树(全功能),Java+ajax实现

我自己要的功能全实现了 一&#xff1a;双击选中项进行编辑 二&#xff1a;右键菜单功能(新增&#xff0c;删除&#xff0c;修改&#xff0c;自定义颜色什么的) 三&#xff1a;选中项进行拖动事件 四&#xff1a;输入项进入搜索(并自动选中结果项) 2011.03.14更新功能 &#xf…

SiteMesh介绍

1. SiteMesh简介 SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观&#xff0c;如一致的导航条&#xff0c;一致的banner&#xff0c;一致的版权等等。它不仅仅能处理动态的内容&#xff0c;…

商汤提基于贪心超网络的One-Shot NAS,达到最新SOTA | CVPR 2020

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;在CVPR 2020上&#xff0c;商汤移动智能事业群-3DAR-身份认证与视频感知组提出了基于贪心超网络的One-Shot NAS方法&#xff0c;显著提升了超网络直接在大规模数据集上的搜索训练效率&#xff0c;并在…

多样化实现Windows phone 7本地数据访问5——深入Rapid Repository

上一篇多样化实现Windows Phone 7本地数据访问<4>——Rapid Repository 中初步的介绍Repid Repository作为Windows phone 7数据库存储原理Repid具有特点以及数据CRUD基本操作.Rapid Repository 是一个基于WP7开源的数据库. 上周联系Rapid 数据库的作者Sean McAlinden.有…

调试Tomcat源码

需要调试Tomcat源码其实很简单&#xff0c; 1.保持你的Tomcat安装文件和源码是版本一致 http://tomcat.apache.org/download-80.cgi 下载安装版和源码2个版本 2.建立Java自由格式项目 先在IDE里配置好Tomcat&#xff0c;这个不复杂。 然后新建一个项目&#xff0c;这个需要…

开源 免费 java CMS - FreeCMS1.9 全文检索

项目地址&#xff1a;http://code.google.com/p/freecms/ 全文检索 从FreeCMS 1.7開始支持 仅仅有创建过索引的对象才干被lucene类标签查询到。 信息类数据会在信息更新、审核、删除、还原操作时自己主动进行全文检索处理。1. 创建索引 从左側管理菜单点击创建索引进入。 您能够…

Spring Mock单元测试

针对post和get import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.…

tar、gzip、gunzip、bzip2、zip、unzip

tar [参数] 文件或目录名 •参数&#xff1a; -c&#xff1a; 建立新的备份档文件。 -f&#xff1a; 对普通文件进行操作。这个参数通常是必选的。 -r&#xff1a; 向备份档文件追加文件。 -x&#xff1a; 从备份档文件中解出文件。 -t&#xff1a; …

港科大谢丹阳教授问诊未来,预测长远趋势与转折点

阳春三月&#xff0c;万象更新&#xff0c;2020年注定是不平凡的一年&#xff01;有激荡就会遇见变革&#xff0c;有挑战就会迎来机遇。今天总会过去&#xff0c;未来将会怎样&#xff1f;香港科大商学院内地办事处重磅推出全新升级的《袁老师访谈录》全新系列【问诊未来院长系…

数字签名与数字证书

先看一下百度百科对数字签名和数字证书的解释&#xff1a; 数字签名&#xff1a; 将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证&#xff1a;只要改动报文中任何一位&#xff0c;重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不…

Spring源码分析【3】-SpingWebInitializer的加载

SpingWebInitializer的加载 Spring基于注解的配置代码&#xff1a; public class SpingWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[]{RootCon…

PyTorch 1.5发布,与AWS联手推出TorchServe

导读&#xff1a;近日 PyTorch 发布了 1.5 版本的更新&#xff0c;作为越来越受欢迎的机器学习框架&#xff0c;PyTorch 本次也带来了大的功能升级。此外&#xff0c; Facebook 和 AWS 还合作推出了两个重要的 PyTorch 库。作者 | 神经星星来源 | HyperAI超神经&#xff08;ID:…

更改时区,时间

整更改ubuntu时区,时间,localePublished by 笨二十一 at 11:56 上午 under Linux/Unix,服务器更改时区&#xff0c;时间执行tzselect按照提示进行选择时区sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime执行sudo ntpdate cn.pool.ntp.orgcn.pool.ntp.org是位于中国…

throttle与debounce的区别

前几天看到一篇文章&#xff0c;我的公众号里也分享了《一次发现underscore源码bug的经历以及对学术界拿来主义的思考》具体文章详见&#xff0c;微信公众号&#xff1a;文中讲了大家对throttle和debounce存在误解&#xff0c;同时提到了《高程3》中实现节流方法存在一些问题&a…

Spring源码分析【0】-框架的基础:继承和接口调用链

Spring源码大量的使用继承和接口调用&#xff0c;现举个例子&#xff0c;不搞清楚这个无法看代码。 public class A extends B{public void f1() {System.out.println("f1 in a");} }public abstract class B extends C {protected abstract void f1();protected Str…