您的位置:首页 > 运维架构 > Shell

关于PowerShell中的OutputType方法属性

2016-04-29 11:32 417 查看
在Windows PowerShell 中有一个新属性就是OutputType,这个属性的主要作用就是用来描述方法所返回的对象类型。接下来让我们看看如何使用这个OutputType属性在普通函数和高级函数中的使用。

首先OutputType的使用语法大致如下,在这里ParameterSetName又是可选的,所以我们不需要每次都使用。

[OutputType([<TypeLiteral>], ParameterSetName="<Name>")]
[OutputType("<TypeNameString>", ParameterSetName="<Name>")]


我们甚至还可以使用多个OutputType类型,比如下面这样:

[OutputType([<Type1>],[<Type2>],[<Type3>])]


接着让我们实际写个简单的函数来看看到底如何使用

function Get-OutType
{
[CmdletBinding()]
[OutputType([System.DateTime])]
Param
(
[Parameter(Mandatory=$true)]
[Int]$Hour
)

}

$Result = Get-Date


这里需要注意的是OutputType属性必须定义在Param前面,在如上例子中我们给OutputTpye设置了一个System.DateTime类型,也就是说这个函数要返回的是一个DateTime类型,最后调用这个函数并把它复制给Result变量。如下图所示,你会看到当你在使用Result这个变量后面插入"." 点符号后PowerShell ISE就会自动智能感知该函数会返回DateTime类型,所以你也会得到DateTime类型相关的属性以及方法。



我们再来看看在高级函数中配合ParameterSetName的使用例子:

function Get-UserInfo
{
[CmdletBinding(DefaultParameterSetName="Age")]

[OutputType("System.Int32", ParameterSetName="Age")]
[OutputType([String], ParameterSetName="Name")]

Param
(
[parameter(Mandatory=$true, ParameterSetName="Age")]
[Int]
$UserAge,

[parameter(Mandatory=$true, ParameterSetName="Name")]
[String]
$UserName
)

$UserAge
$UserName
}


当然设定了OutputType属性的函数未必每次返回的类型都是精确的,我们可以看看如下例子就知道为什么说未必每次都是精确的。

function Get-OutType
{
[CmdletBinding()]
[OutputType([String])]
Param
(
[Parameter(Mandatory=$false)]
[Int]$Hour
)

return Get-Date
}

(Get-OutType).GetType()


该函数体设置了一个String类型的 OutputType属性值,但是我们通过GetType方法却得到如下结果,很明显方法返回了一个DateTime类型。

<p class="p1">IsPublic IsSerial Name                                     BaseType                                                                                                                            </p><p class="p1">-------- -------- ----                                     --------                                                                                                                            </p><p class="p1">True     True     DateTime                                 System.ValueType  </p>


但是我们用Get-Command 去查看函数并调用OutputType属性时会发现依然是我们定义的String类型

Name          Type          TypeDefinitionAst
----          ----          -----------------
System.String System.String
所以OutputType更多的只是为了描述函数体要返回何种类型,但未必就一定是你所描述的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: