为什么下面的类型会改变?
function SomeFunction($SomeParameter){
return $SomeParameter
}
我想我需要设置一个返回类型,但是如何设置?
一个例子是使用:
$NewFolder=Join-Path $CurrentFolder -ChildPath $FolderName
$Tmp=SomeFunction($NewFolder)
现在
$Tmp
是一个数组而不仅仅是一个路径
虽然这个答案解释了您所看到的行为,但在这里我将尝试回答实际问题:如何声明函数的预期输出类型!
您可以通过向函数的
[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
的更多信息
您的问题与“设计”有关。 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 答案 更详细地解释了该行为。
希望有帮助。