The weird 'return' in powershell

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,一起返回。

MDN也是如此的解释:

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。
这里写图片描述

欢迎批评交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值