为什么下面的类型会改变?
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
你的问题是根据“设计”。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 答案更详细地解释了这种行为。
希望有帮助。
归档时间: |
|
查看次数: |
6082 次 |
最近记录: |