【问题标题】:Powershell where-object return codePowershell where-object 返回码
【发布时间】:2018-03-07 05:10:23
【问题描述】:

很长一段时间后,我从 bash 回到了 powershell,我发现 where 对象的行为非常令人困惑。

为什么下面的sn -p 返回成功?什么都找不到!为什么这不像 grep 那样返回失败?

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

【问题讨论】:

标签: windows powershell error-handling exit-code


【解决方案1】:

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." }

正如 PetSerAl 指出的那样,PowerShell 中的自动(布尔)$? 变量与传统 shell 中的退出代码(抽象)等效

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

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

在手头的情况下您要确定是否通过调用Where-Object cmdlet(通过其内置别名? 调用)执行的过滤操作 返回任何匹配项,但在 PowerShell 中,该状态不会单独反映在任何地方
因此,您必须检查输出本身以确定是否有任何匹配项,如顶部的 sn-p 所示。

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

【讨论】:

    猜你喜欢
    • 2022-10-07
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2020-06-29
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多