Windows Powershell属性:描述对象是什么
属性可以描述一个对象,对象的属性可以被powershell自动转换成文本,并且输出到控制台。因此可以通过这种方法查看任何对象,例如$host:
ps c:powershell> $host
name : consolehost
version : 2.0
instanceid : 7fefa1fa-fb2e-47c7-a867-c13b123da5c2
ui : system.management.automation.internal.host.internalhostuserinterface
currentculture : zh-cn
currentuiculture : zh-cn
privatedata : microsoft.powershell.consolehost+consolecolorproxy
isrunspacepushed : false
runspace : system.management.automation.runspaces.localrunspace
internalhost对象存储在$host变量中,包含9个属性。输出的第一列为对象的属性,第二列为文本形式的属性值。例如要查看当前powershell的版本号,可以访问$host对象的version属性:
ps c:powershell> $host.version
major minor build revision
----- ----- ----- --------
2 0 -1 -1
由此可知,version并不是以一串单独的数字存储的,它本身也是一个对象,包含 major,minor,build,revision四个属性,可以查看version的具体类型,也可以访问它的每一个属性:
ps c:powershell> $host.version.gettype().fullname
system.version
ps c:powershell> $host.version.build
-1
ps c:powershell> $host.version.major
2
ps c:powershell> $host.version.majorrevision
-1
ps c:powershell> $host.version.revision
-1
查看一个对象的类型很实用,因为可以通过这个类型构造新的对象或者进行类型转换等等。
ps c:powershell> [system.version]'2012.12.20.4444'
major minor build revision
----- ----- ----- --------
2012 12 20 4444
例如currentculture属性,可以通过$host的currentculture访问当前系统的本地化信息和该信息的类型:
ps c:powershell> $host.currentculture
lcid name displayname
---- ---- -----------
2052 zh-cn 中文(*)
ps c:powershell> $host.currentculture.gettype().fullname
system.globalization.cultureinfo
currentculture包含3个属性,lcid, name, and displayname。通过msdn查看system.globalization.cultureinfo的构造函数可知,可以将国家代码和国家名称标志字符串转换成一个新的cultureinfo对象。
ps c:powershell> [system.globalization.cultureinfo]'zh-cn'
lcid name displayname
---- ---- -----------
2052 zh-cn 中文(*)
ps c:powershell> [system.globalization.cultureinfo]'zh-tw'
lcid name displayname
---- ---- -----------
1028 zh-tw 中文(*)
ps c:powershell> [system.globalization.cultureinfo]'en-us'
lcid name displayname
---- ---- -----------
1033 en-us 英语(美国)
ps c:powershell> [system.globalization.cultureinfo] 55
lcid name displayname
---- ---- -----------
55 ka 格鲁吉亚语
ps c:powershell> [system.globalization.cultureinfo] 1
lcid name displayname
---- ---- -----------
1 ar 阿拉伯语
ps c:powershell> [system.globalization.cultureinfo] 33
lcid name displayname
---- ---- -----------
33 id 印度尼西亚语
属性中包含对象
一个对象的属性用来存储数据,反过来这些数据又可以存储其它对象。$host有两个比较特别的属性ui和privatedata。把$host对象输出到控制台上后,除了ui和privatedata所有的属性都会被转换成确定的文本:
ps c:powershell> $host
name : consolehost
version : 2.0
instanceid : 7fefa1fa-fb2e-47c7-a867-c13b123da5c2
ui : system.management.automation.internal.host.internalhostuserinterface
currentculture : zh-cn
currentuiculture : zh-cn
privatedata : microsoft.powershell.consolehost+consolecolorproxy
isrunspacepushed : false
runspace : system.management.automation.runspaces.localrunspace
原因是这两个属性中又包含了一个对象:
ps c:powershell> $host.ui
rawui
-----
system.management.automation.internal.host.internalhostrawuserinterface
ps c:powershell> $host.ui.rawui
foregroundcolor : darkyellow
backgroundcolor : darkmagenta
cursorposition : 0,23
windowposition : 0,0
cursorsize : 25
buffersize : 100,200
windowsize : 100,61
maxwindowsize : 100,62
maxphysicalwindowsize : 160,62
keyavailable : false
windowtitle : windows powershell
“rawui” 为 “raw user interface” 提供了配置powershell控制台用户界面的接口。上面的属性可以读取,但是个别却不能更改。
只读属性和读写属性
属性可以准确的描述对象,一旦属性更改了。这一更改也会体现在对象上。如果不能更改,属性就是“只读”属性。
通过简单地修改控制台的背景和前景的颜色,可以发现属性更改可以直接反映到对象上。
ps c:powershell> $host.ui.rawui.backgroundcolor = "green"
ps c:powershell> $host.ui.rawui.foregroundcolor = "white"
ps c:powershell> cls
有的属性不能更改,如果尝试修改,就会抛出异常。
ps c:powershell> $host.ui.rawui.keyavailable
false
ps c:powershell> $host.ui.rawui.keyavailable=$false
“keyavailable”为 readonly 属性。
所在位置 行:1 字符: 16
+ $host.ui.rawui. <<<< keyavailable=$false
+ categoryinfo : invalidoperation: (:) [], runtimeexception
+ fullyqualifiederrorid : propertyassignmentexception
控制台是否接收到了一个按键请求,应当取决于用户的操作,因此该属性拒绝被更改,你只能读取它。
rawui的属性
foregroundcolor:前景色
backgroundcolor:背景色
cursorposition:光标的位置
windowposition:窗口的位置
cursorsize:光标的大小
buffersize:缓冲区的大小
windowsize:窗口的大小
maxwindowsize:允许窗口的最大值
maxphysicalwindowsize:窗口可能的最大值
keyavailable:是否存在按键
windowtitle:窗口的标题
属性的类型
有些属性只接受整数值,例如控制台光标的大小,值域在0-100,用来控制关闭大小的百分比。可以将光标设置为75%,但是不能超过100%,否则就会产生错误。
ps c:powershell> $host.ui.rawui.cursorsize=75
ps c:powershell> $host.ui.rawui.cursorsize=101
设置“cursorsize”时发生异常:“无法处理 cursorsize,因为指定的光标大小无效。
参数名: value
实际值是 101。”
所在位置 行:1 字符: 16
+ $host.ui.rawui. <<<< cursorsize=101
+ categoryinfo : invalidoperation: (:) [], runtimeexception
+ fullyqualifiederrorid : propertyassignmentexception
另一个属性foregoundcolor的类型为color枚举值。因此给foregoundcolor所赋的值必须是已经在system.consolecolor中定义过的。可以将“black”但是不能使用“pink”
ps c:powershell> $host.ui.rawui.foregroundcolor="black"
ps c:powershell> $host.ui.rawui.foregroundcolor="pink"
设置“foregroundcolor”时发生异常:“由于枚举值无效,无法将值“pink”转换为类型“system.consolecolor
”。请指定以下枚举值之一,然后重试。可能的枚举值为“black、darkblue、darkgreen、darkcyan、darkred、
darkmagenta、darkyellow、gray、darkgray、blue、green、cyan、red、magenta、yellow、white”。”
所在位置 行:1 字符: 16
+ $host.ui.rawui. <<<< foregroundcolor="pink"
+ categoryinfo : invalidoperation: (:) [], runtimeexception
+ fullyqualifiederrorid : propertyassignmentexception
可以使用[system.enum]::getnames 方法查看consolecolor定义的所有颜色。
ps c:powershell> [system.enum]::getnames([system.consolecolor])
black
darkblue
darkgreen
darkcyan
darkred
darkmagenta
darkyellow
gray
darkgray
blue
green
cyan
red
magenta
yellow
white
有时一个属性期望的赋值必须是一个指定类型的对象。例如windowsize,如果想改变powershell的窗口大小,可是设置windowsize属性,但是它是一个system.management.automation.host.size对象,怎样获取这个对象呢?
1.先读取属性,保存为临时变量,更改临时变量,将临时变量赋给windowsize
2.直接创建一个system.management.automation.host.size,赋给windowsize
ps c:powershell> $tmp=$host.ui.rawui.windowsize
ps c:powershell> $tmp
width height
----- ------
100 60
ps c:powershell> $tmp.height=30
ps c:powershell> $tmp.width=60
ps c:powershell> $host.ui.rawui.windowsize=$tmp
width height
----- ------
60 30
ps c:powershell> $host.ui.rawui.windowsize=new-object system.management.automation.host.size(60,40)
ps c:powershell> $host.ui.rawui.windowsize
width height
----- ------
60 40
查看所有属性
因为属性和方法都是对象的成员,可以使用get-member可以返回它们的成员的详细信息,如果只显示属性可以使用参数 membertype 为“property”
ps c:powershell> $host | get-member -membertype property
typename: system.management.automation.internal.host.internalhost
name membertype definition
---- ---------- ----------
currentculture property system.globalization.cultureinfo currentculture {get;}
currentuiculture property system.globalization.cultureinfo currentuiculture {get;}
instanceid property system.guid instanceid {get;}
isrunspacepushed property system.boolean isrunspacepushed {get;}
name property system.string name {get;}
privatedata property system.management.automation.psobject privatedata {get;}
runspace property system.management.automation.runspaces.runspace runspace {get;}
ui property system.management.automation.host.pshostuserinterface ui {get;}
version property system.version version {get;}
在name列,可以看到$host支持的所有属性。在definition列首先列出属性的具体类型,然后列出构造器,如果一个构造器中只有get方法,没有set方法,表示该属性为只读属性。
下一篇: 笑喷,最调皮捣蛋的是逗B