Powershell 如何强制函数返回单个元素数组而不是包含的对象?

Powershell 如何强制函数返回单个元素数组而不是包含的对象?,powershell,powershell-5.0,Powershell,Powershell 5.0,我有一个函数,实际上它有几个实例,但有时它可能返回几个元素的列表,有时它可能返回单个元素。我希望函数每次都返回一个数组[System.Object[],这样在接收端,我就可以始终预期它是一个数组并索引到其中,即使我只是拉第0个元素 我尝试了多种方式转换返回类型,请参见下面的代码。。。包括例如return@asdf、return[System.Object[]@asdf和类似的内容,但似乎只有在数组中添加第二个null元素才能获得一致的行为。。。我觉得这是不对的。请参阅下面的代码 function

我有一个函数,实际上它有几个实例,但有时它可能返回几个元素的列表,有时它可能返回单个元素。我希望函数每次都返回一个数组[System.Object[],这样在接收端,我就可以始终预期它是一个数组并索引到其中,即使我只是拉第0个元素

我尝试了多种方式转换返回类型,请参见下面的代码。。。包括例如return@asdf、return[System.Object[]@asdf和类似的内容,但似乎只有在数组中添加第二个null元素才能获得一致的行为。。。我觉得这是不对的。请参阅下面的代码

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我相信你是绝对正确的!:-