Powershell where-object 返回码

Posted

技术标签:

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

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

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

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

【问题讨论】:

这可能会有所帮助:github.com/PowerShell/PowerShell/issues/3359 PowerShell cmdlet具有本机可执行文件所具有的返回码。没有ErrorRecord就不能返回失败。 【参考方案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。

【讨论】:

以上是关于Powershell where-object 返回码的主要内容,如果未能解决你的问题,请参考以下文章

如何像 IN 语句一样使用 Powershell Where-Object

PowerShell Where-Object 语句中的多个 -and -or

PowerShell Where-Object 筛选出包含指定内容的行

powershell 关于如何实现同一属性上的多个条件的简化Where-Object的概念证明

Where-Object 多个条件不起作用

获取 WMIObject PowerShell