Powershell where-object return 代码

Powershell where-object return code

我 return 从 bash 转向 powershell 已经很长时间了,我发现 where 对象的行为非常令人困惑。

为什么以下代码段 return 成功?没有找到!为什么这不像 grep 那样 return 失败?

C:> Get-Process | ?{$_.name -like "laksdjfajsdfkjasdkf"}
C:> echo $?
True

tl;dr

# 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 中退出代码的(抽象)等价物,正如 PetSerAl 指出的那样。

$?只是告诉你最后一条语句是否成功和围绕它的规则很复杂,如 the GitHub discussion that Owain Esau links to 所示。
成功表示没有错误发生,过滤操作不返回任何东西根据该定义的成功。
简而言之:$? 在 PowerShell 中的用处有限。

但是最近执行的external程序的exit code反映在自动变量$LASTEXITCODE中,所以有你实际上调用了 grep,它的退出代码会反映在那里。
(虽然 $? 在 执行外部程序后立即设置 以反映 $True 如果退出代码是 0$False否则,$? 可能在语句结束时已经反映了某些东西 else,这取决于语句的具体情况,例如将调用包含在 (...))

在手头的案例中,您要确定过滤操作 是否通过调用 Where-Object cmdlet(通过其 built-in 别名 ?) 返回了任何匹配项,但是 在 PowerShell 中,状态是 单独反映在任何地方.
因此,您 必须检查 输出本身 以确定是否匹配任何内容,如顶部的代码片段所示。

在这种情况下没有错误,但为了完整起见: PowerShell 的错误处理 很复杂,但又不同于传统的 shell;你可以找到 overview here.