代码之家  ›  专栏  ›  技术社区  ›  thisguy123

Powershell where对象返回代码

  •  1
  • thisguy123  · 技术社区  · 7 年前

    很长一段时间后,我将从bash返回powershell,我发现where对象的行为非常混乱。

    为什么以下代码段返回成功?找不到任何内容!为什么这不会像grep那样返回失败?

    C:> Get-Process | ?{$_.name -like "laksdjfajsdfkjasdkf"}
    C:> echo $?
    True
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   mklement0    7 年前

    tl;博士

    # Run the command and, in addition to outputting to the console,
    # collect the results in variable $result, via common parameter -OutVariable / -ov 
    # If you do NOT need to output to the console, simply use:
    #     $result = Get-Process | ...
    Get-Process | ? { $_.name -like "laksdjfajsdfkjasdkf" } -ov result
    
    # Test if the result is empty (using implicit Boolean conversion)
    if (-not $result) { Write-Warning "Nothing matched." }
    

    PowerShell的自动(布尔) $? PowerShell中的变量为 传统shell中退出码的(抽象)等价性 正如佩瑟拉尔指出的那样。

    $? 告诉你最后一句话 已成功 以及 围绕它的规则很复杂 the GitHub discussion that Owain Esau links to 显示。
    已成功 意味着没有 错误 发生,并且筛选操作未返回任何内容 按照这个定义,成功就是成功。
    简而言之: $? 在PowerShell中用处有限。

    但是 最近执行的退出代码 外部的 程序反映在自动变量中 $LASTEXITCODE ,那么您实际上调用了 grep ,其退出代码将反映在那里。
    (和while $? 已设置 紧接着 执行外部程序以反映 $True 如果退出代码为 0 $False 否则 $? 可能已经反映了一些东西 其他的 语句完成时,具体取决于语句的细节,例如将调用封装在 (...) )

    在手头的箱子里 您要确定筛选操作 由调用执行 Where-Object cmdlet(通过其内置别名调用 ? ) 已返回所有匹配项 但是 在PowerShell中,状态为 单独反映在任何地方
    所以你 必须检查 输出本身 以确定是否有匹配的内容,如顶部的代码段所示。

    没有 错误 在这种情况下,但为了完整起见: PowerShell的 错误处理 是复杂的,但又不像传统的贝壳;您可以找到 overview here