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

Chr*_* G. 5 powershell

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

function SomeFunction($SomeParameter){
    return $SomeParameter
}
Run Code Online (Sandbox Code Playgroud)

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

一个例子是使用:

$NewFolder=Join-Path $CurrentFolder -ChildPath $FolderName
$Tmp=SomeFunction($NewFolder)
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*sen 12

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

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

function SomeFunction
{
    param($SomeParameter)

    return $SomeParameter
}
Run Code Online (Sandbox Code Playgroud)

现在我们只需要添加[OutputType]属性装饰器:

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

    return $SomeParameter
}
Run Code Online (Sandbox Code Playgroud)

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

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

    return $SomeParameter
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,它[OutputType()]保证执行期间发出的对象的类型,它只是函数作者指示预期输出类型的一种方法。

阅读帮助文件[OutputType]中的更多信息about_Functions_OutputTypeAttribute


Moe*_*ald 3

你的问题是根据“设计”。PowerShell 将返回一个分块数组,以便可以将其转发到 PowerShell 管道。

例子:

 SomeFunction -SomeParameter @(1,2,3,4) | Where-Object { $_ -gt 2 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

@()另一种选择是在调用方使用when:

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

$array = @(SomeFunction -SomeParameter 1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

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

希望有帮助。