如何在 PowerShell 中返回值

  1. 在 PowerShell 中使用 return 关键字
  2. PowerShell 管道中的返回值
  3. 在 PowerShell 5 中定义类
如何在 PowerShell 中返回值

通常,return 关键字用于退出一个函数、脚本或脚本块。因此,例如,我们可以在特定点使用它离开一个作用域、返回一个值或者表示作用域的结束已达到。

然而,在 Windows PowerShell 中,使用 return 关键字可能会有些混乱,因为您的脚本可能会输出您未曾预料到的内容。

本文将讨论 return 关键字的工作原理以及如何在 Windows PowerShell 中正确使用它们。

在 PowerShell 中使用 return 关键字

下面的脚本块是 return 关键字语法的基本形式。

return <expression>

return 关键字可以单独出现,也可以有一个值或表达式跟随在后。单独的 return 关键字将命令行返回到其先前的调用点。

return
return $a
return (1 + $a)

下面的示例在特定点满足条件时使用 return 关键字退出一个函数。在这个例子中,奇数没有被乘以,因为 return 语句在该语句可以执行之前就已执行。

function MultiplyOnlyEven {
    param($num)

    if ($num % 2) { return "$num is not even" }
    $num * 2
    return
}

1..10 | ForEach-Object { MultiplyOnlyEven -Num $_ }

输出:

1 is not even
4
3 is not even
8
5 is not even
12
7 is not even
16
9 is not even
20

从更本土的编程视角来看,Windows PowerShell 具有令人困惑的返回语义。我们需要考虑两个主要观点:

  1. 所有输出都被捕获并返回。
  2. return 关键字表示逻辑退出点。

说到这,以下几个脚本块将返回 $a 变量的值。

带表达式的 return 关键字:

$a = "Hello World"
return $a

不带表达式的 return 关键字:

$a = "Hello World"
$a
return

在第二个脚本块中也不需要 return 关键字,因为在命令行调用变量将明确返回该变量。

PowerShell 管道中的返回值

当您从脚本块或函数中返回一个值时,Windows PowerShell 会自动逐个弹出成员并推送它们通过管道。这样使用的原因是由于 Windows PowerShell 的逐个处理。

以下函数演示了这个概念,将返回一个数字数组。

function Test-Return {
    $array = 1, 2, 3
    return $array
}
Test-Return | Measure-Object | Select-Object Count

输出:

Count
-----
    3

在使用 Test-Return 命令时,下面函数的输出被传递到 Measure-Object 命令中。该命令将计算管道中的对象数量,在执行时,返回的计数是三。

要使脚本块或函数仅返回单个对象到管道,可以使用以下方法之一:

在 PowerShell 中利用一元数组表达式

利用一元表达式可以将您的返回值作为单个对象发送到管道,如以下示例所示。

function Test-Return {
    $array = 1, 2, 3
    return (, $array)
}
Test-Return | Measure-Object | Select-Object Count

输出:

Count
-----
    1

在 PowerShell 中使用带 NoEnumerate 参数的 Write-Output

我们还可以使用带有 -NoEnumerate 参数的 Write-Output 命令。下面的示例使用 Measure-Object 命令计算从示例函数通过 return 关键字发送到管道的对象数量。

示例代码:

function Test-Return {
    $array = 1, 2, 3
    return Write-Output -NoEnumerate $array
}
Test-Return | Measure-Object | Select-Object Count

输出:

Count
-----
    1

另一种强制管道只返回单个对象的方法是在 PowerShell 版本 5 中引入的,我们将在文章的下一部分讨论。

在 PowerShell 5 中定义类

在 Windows PowerShell 版本 5.0 中,我们现在可以创建和定义自定义类。将您的函数更改为类,return 关键字将仅返回紧接在其前面的单个对象。

示例代码:

class test_class {
    [int]return_what() {
        Write-Output "Hello, World!"
        return 1000
    }
}
$tc = New-Object -TypeName test_class
$tc.return_what()

输出:

1000

如果上述类是一个函数,它将返回管道中存储的所有值。

输出:

Hello World!
1000
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn