如何在 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 具有令人困惑的返回语义。我们需要考虑两个主要观点:
- 所有输出都被捕获并返回。
- 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
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn