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 筛选出包含指定内容的行