Powershell 如何强制函数返回单个元素数组而不是包含的对象?
我有一个函数,实际上它有几个实例,但有时它可能返回几个元素的列表,有时它可能返回单个元素。我希望函数每次都返回一个数组[System.Object[],这样在接收端,我就可以始终预期它是一个数组并索引到其中,即使我只是拉第0个元素 我尝试了多种方式转换返回类型,请参见下面的代码。。。包括例如return@asdf、return[System.Object[]@asdf和类似的内容,但似乎只有在数组中添加第二个null元素才能获得一致的行为。。。我觉得这是不对的。请参阅下面的代码Powershell 如何强制函数返回单个元素数组而不是包含的对象?,powershell,powershell-5.0,Powershell,Powershell 5.0,我有一个函数,实际上它有几个实例,但有时它可能返回几个元素的列表,有时它可能返回单个元素。我希望函数每次都返回一个数组[System.Object[],这样在接收端,我就可以始终预期它是一个数组并索引到其中,即使我只是拉第0个元素 我尝试了多种方式转换返回类型,请参见下面的代码。。。包括例如return@asdf、return[System.Object[]@asdf和类似的内容,但似乎只有在数组中添加第二个null元素才能获得一致的行为。。。我觉得这是不对的。请参阅下面的代码 function
function fn1 {
return @("asdf")
}
function fn2 {
return [array]@("asdf")
}
function fn3 {
return [System.Object[]]@("asdf")
}
function fn4 {
# This works but with the side effect of sending a null string that is not actually necessary
return @("asdf",$Null)
}
$v = fn1 # Same for fn2, fn3.
$v.GetType().Name # Expected: Object[], Actual: String
$v[0] # Expected: "asdf", Actual: "a"
$v = fn4
$v.GetType().Name # Expected: Object[], Actual: Object[]
$v[0] # Expected: "asdf", Actual: "asdf"
如果我理解您的问题,您可以在返回值时使用,运算符;e、 g:
function fn1 {
,@("asdf")
}
该函数将输出一个元素数组。如果我理解您的问题,您可以在返回值时使用,运算符;e、 g:
function fn1 {
,@("asdf")
}
该函数将输出一个元素数组。作为在额外数组中换行的替代方法,请使用Write output-NoEnumerate: 或者,在版本4.0之前的cmdlet绑定/高级函数中:
function fn1 {
[CmdletBinding()]
param()
$PSCmdlet.WriteObject(@('asdf'), $false)
}
作为在额外数组中换行的替代方法,请使用Write Output-NoEnumerate: 或者,在版本4.0之前的cmdlet绑定/高级函数中:
function fn1 {
[CmdletBinding()]
param()
$PSCmdlet.WriteObject(@('asdf'), $false)
}
问题不在于功能,而在于消费者;PowerShell急切地打开集合。[string[]]$v=fn1没有相同的问题$v=@fn1也起作用。可以让函数返回一个双包装数组@asdf,而不必更改调用者,但这实际上可能更令人困惑;PowerShell急切地打开集合。[string[]]$v=fn1没有相同的问题$v=@fn1也起作用。可以让函数返回双包装数组@asdf,而不必更改调用者,但这实际上可能更令人困惑。我相信-NoEnumerate最早出现在PSv4中。@Bill\u Stewart我相信你是绝对正确的!:-我相信-NoEnumerate第一次出现在PSv4中。@Bill\u Stewart我相信你是绝对正确的!:-