PowerShell 中的返回值

Marion Paul Kenneth Mendoza 2023年1月30日
  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 变量的值。

使用表达式返回关键字:

$a = "Hello World"
return $a

返回不带表达式的关键字:

$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 cmdlet 时,以下函数的输出通过管道传送到 Measure-Object cmdlet。该 cmdlet 将计算管道中对象的数量,并且在执行时,返回的计数为 3。

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

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

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

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

输出:

Count
-----
    1

在 PowerShell 中使用 Write-OutputNoEnumerate 参数

我们还可以将 Write-Output cmdlet 与 -NoEnumerate 参数一起使用。下面的示例使用 Measure-Object cmdlet 对通过 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
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