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.
我 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.