PowerShell不会将空数组作为数组返回

use*_*005 22 arrays powershell

鉴于这是有效的:

$ar = @()
$ar -is [Array]
  True
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

function test {
    $arr = @()
    return $arr
}

$ar = test
$ar -is [Array]
  False
Run Code Online (Sandbox Code Playgroud)

也就是说,为什么测试函数不返回空数组呢?

Ans*_*ers 28

您的函数不起作用,因为PowerShell返回所有未捕获的流输出,而不仅仅是return语句的参数.$null在此过程中,一个空数组被破坏.但是,您可以通过在数组构造运算符(,)前面添加数组来保留数组:

function test {
  $arr = @()
  return ,$arr
}
Run Code Online (Sandbox Code Playgroud)

  • 太令人沮丧了。如果您返回@(/*一些具有零个元素的过滤表达式*/),您也会遇到相同的行为。return ,@(/*expr*/) 是一个修复...但它很糟糕。所以很容易被忽视。 (3认同)
  • @BradFJacobs,虽然这通常是正确的,但我认为 _return_ 只是一个错误。根据 Bruce Payette(PowerShell 的设计者之一)的说法,为 _control flow_ 添加了 _return_ 语句,并且 `return $x` 只是 `Write-Output $x' 的简写;返回`。显然关键字应该是 **ExitSub** 并且它不应该接受参数。 (2认同)