如下说明是翻译
: help about_types
产生的帮助信息
.
译者
: Edengundam(
马涛
)
.NET Type Extension
SHORT DESCRIPTION
在Windows PowerShell 中对.NET type system 进行扩展
LONG DESCRIPTION
PowerShell安装目录中的types.ps1xml文件提供了一种对.Net类型系统进行扩展的机制. 默认的情况下, PowerShell已经添加了一些对.NET类型进行了扩展的元素. 除此之外, 你可以添加一些元素来进行自己的个性化设置.
添加一个属性是对类型进行扩展的一种方法. 要添加一个属性 (或者以任何方式对类型进行扩展), 你必须针对该类型修改其在types.ps1xml文件中的<type>元素. 例如, 数组类型在默认情况下不包含Count这个属性, 所以PowerShell定义了一个Count的别名属性(alias property)(译者注: 这种定义是为了使PowerShell对于不同类型的对象有一种统一的名称机制). 这个别名属性引用的是叫做Length属性(译者注: 这里就是.Net的Array中, 数组长度Length), 如下面XML所示:
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>
Length
</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
你可以使用Get-Member 命令, 取出数组中所有属性, 来验证别名属性(AliasProperty), 如下面的示例:
Get-Member -inputobject (1,2,3,4) -member *property*
命令返回如下结果:
TypeName: System.Object[]
Name MemberType Definition
Count AliasProperty Count = Length
IsFixed SizeProperty System.Boolean IsFixedSize {ge
IsReadOnly Property System.Boolean IsReadOnly {get
IsSynchronized Property System.Boolean IsSynchronized
Length Property System.Int32 Length {get;}
LongLength Property System.Int64 LongLength {get;}
Rank Property System.Int32 Rank {get;}
SyncRoot Property System.Object SyncRoot {get;}
正如你所看到, 属性中列出了Count别名属性和该属性的定义"Count = Length."
在types.ps1xml文件中, 你可以定义脚本属性(script property), 当执行赋值或取值时(译者注: 类似面向对象中的get和set), 该对应脚本就会被执行. 例如, types.ps1xml文件, 为.Net的DateTime对象添加了包含了一个脚本块的DataTime成员(译者注: 这里是GetScriptBlock, 此属性只能取值):
<Type>
<Name>System.DateTime</Name>
<Members>
<ScriptProperty>
<Name>DateTime</Name>
<GetScriptBlock>
if ($this.DisplayHint -ieq "Date")
{
"{0}" -f $this.ToLongDateString()
}
elseif ($this.DisplayHint -ieq "Time")
{
"{0}" -f $this.ToLongTimeString()
}
else
{
"{0} {1}" -f $this.ToLongDateString(),
$this.ToLongTimeString()
}
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
此脚本块用于对日期进行格式化, 使得根据不同输入值的类型(只提供日期, 只提供时间, 既提供日期也提供时间), 可以产生一致的结果. 例如, 假设你声明了变量$a如下面命令:
[datetime]$a = "5 march 05"
PowerShell将会转换该值为长日期格式(译者注:输出格式根据DisplayHint决定):
Saturday, March 05, 2005 12:00:00 AM
如果你使用"March 5, 2005"来声明该变量, 你将会得到一样的结果.
文件types.ps1xml还可以定义属性集(property set). 属性集就是属性的集合, 这样你就可以从逻辑上将这些属性当作一个对象进行使用. 例如, PowerShell为DirectoryEntry系统类型定义了一个属性集:
<Type>
<Name>System.DirectoryServices.DirectoryEntry</Name>
<Members>
<MemberSet>
<Name>PsStandardMembers</Name>
<Members>
<PropertySet>
<Name>
DefaultDisplayPropertySet
</Name>
<ReferencedProperties>
<Name>
distinguishedName
</Name>
</ReferencedProperties>
</PropertySet>
</Members>
</MemberSet>
</Members>
</Type>
在这个 <type> 元素中, 属性集DefaultDisplayPropertySet引用了distinguishedName属性.
除了修改已经存在的types.ps1xml文件(译者注: 尽量不要修改PowerShell安装目录下的类型文件, 如果PowerShell升级, 可能会覆盖系统自带的文件), 你也可创建自己的types.ps1xml文件, 添加类型, 属性的定义, 甚至覆盖默认的类型和属性定义. 你可以将新的文件存放在PowerShell命令目录(译者注: 类似于PATH环境变量, PowerShell会一个一个目录的进行搜索.)中的任意一个目录. 如果你的文件定义了一个已经存在的类型或属性, 它将覆盖命令路径中较早出现的types.ps1xml中定义的重复类型或属性.
您还可以参考
需要关于Get-Member cmdlet的信息, 输入如下命令:
help Get-Member