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
变量的值。
使用表达式返回关键字:
$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-Output
和 NoEnumerate
参数
我们还可以将 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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn