Powershell 对于初学者来说,怪异之处良多,一个function的返回值可能并不都是你想要的,直接上代码
function isThere(){
$arr = 1..10
foreach($item in $arr){
if($item -eq 5){
return $true
}
}
return $false
}
function isThere1(){
$arr = 1..10
$arr | ForEach-Object{
if($_ -eq 5){
return $true
}
}
return $false
}
isThere # 返回值:$true
isThere1 # 返回值:[$true,$false]
问题一: Powershell会返回好多值
与其他编程语言java,c#,javascript等不同,powershell作为一个bash脚本,其命令可能会有返回值,比如new-item在命令行内就会返回新创建的对象,在ps1脚本内也会返回,但是在function函数内,会将结果组成一个collection或者list,一起返回。
In PowerShell, values can be returned even if the Return keyword is not used. The results of each statement are returned.
在Powrshell里,不管用不用Return关键字,值都会被返回。
function calc($x,$y){
$x;
$sum = $x+$y
New-Item -Path . -Name "sum.log" -ItemType "file" -Value $sum
return $sum
}
举个例子,上边是一个求和的函数,求和的过程中需要把和存到一个sum.log的文件中,并返回和值。但是return $sum 并不会是你想要的两个的和值,因为new-item会有生成文件的结果也一并返回,所以,而是一个PSarray对象,里边第一项会是new-item的结果,第二项为你的和值。
问题二: Return只能跳出当前的作用域
最上边例子,为什么用过pipeline的foreach-object会返回[true,false]呢,因为从问题一可以知道,Powershell的function会收集所有的返回值来一起return。而return true以后,又执行了 return false,所以才形成了这样的结果,那问题就来了,为什么return没跳出整个function返回第一个true呢?
SHORT DESCRIPTION
Exits the current scope, which can be a function, script, or script block.
Return会跳出当前的作用域,包括函数,脚本,块级脚本
而不巧的是foreach-object刚好就是script block。所以return只会跳出foreach-object,后边的return false仍然会执行,而foreach并不是上述的三者之一,所以return会跳出整个function,并返回我想要的true。
欢迎批评交流