如何定义函数的返回类型/OutputType

问题描述 投票:0回答:2

为什么下面的类型会改变?

function SomeFunction($SomeParameter){
    return $SomeParameter
}

我想我需要设置一个返回类型,但是如何设置?

一个例子是使用:

$NewFolder=Join-Path $CurrentFolder -ChildPath $FolderName
$Tmp=SomeFunction($NewFolder)

现在

$Tmp
是一个数组而不仅仅是一个路径

powershell function return-value return-type
2个回答
15
投票

虽然这个答案解释了您所看到的行为,但在这里我将尝试回答实际问题:如何声明函数的预期输出类型

您可以通过向函数的

[OutputType]
块添加
param()
属性来实现此目的 - 因此您要做的第一件事就是跳过 C# 样式的参数列表并声明一个正确的
param
块:

function SomeFunction
{
    param($SomeParameter)

    return $SomeParameter
}

现在我们只需要添加

[OutputType]
属性装饰器:

function SomeFunction
{
    [OutputType([string])]
    param($SomeParameter)

    return $SomeParameter
}

由于在本例中我们只是按原样返回参数参数值,因此我们应该表现得很好并确保它实际上也是一个字符串:

function SomeFunction
{
    [OutputType([string])]
    param(
        [string]$SomeParameter
    )

    return $SomeParameter
}

值得注意的是,

[OutputType()]
对于执行期间发出的对象的类型不保证,这只是函数作者指示预期输出类型的一种方式。

[OutputType] 帮助文件中了解有关 
about_Functions_OutputTypeAttribute
的更多信息


4
投票

您的问题与“设计”有关。 PowerShell 将返回一个分块数组,以便可以将其转发到 PowerShell 管道。

示例:

 SomeFunction -SomeParameter @(1,2,3,4) | Where-Object { $_ -gt 2 }

如果没有这种行为,就不可能将函数的输出管道化到另一个函数/cmdlet。

如果你想返回一个数组,你可以将代码更改为:

 function SomeFunction($SomeParameter){
    <#
     # Through the unary operator we can return an array with one entry.
     # This entry contains the original array.
     #>
    ,$SomeParameter
}

另一种选择是在调用方时使用

@()

function SomeFunction($SomeParameter){
    # return to pipelin
    $SomeParameter
}

$array = @(SomeFunction -SomeParameter 1,2,3,4)

还有这个 reddit 答案 更详细地解释了该行为。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.