当前位置: 移动技术网 > IT编程>脚本编程>Shell > Windows Powershell属性:描述对象是什么

Windows Powershell属性:描述对象是什么

2017年12月08日  | 移动技术网IT编程  | 我要评论

属性可以描述一个对象,对象的属性可以被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方法,表示该属性为只读属性。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网