欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-29 21:49:59
属性可以描述一个对象,对象的属性可以被powershell自动转换成文本,并且输出到控制台。因此可以通过这种方法查看任何对象,例如$host: 复制代码 代码如下: p...

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