在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更多的只是为了描述函数体要返回何种类型,但未必就一定是你所描述的。