为何PowerShell处理jfrog命令的$?退出码时判断异常?
核心原因
你混淆了PowerShell的两类判断逻辑:if()语句对外部命令的判断规则,和$?状态变量的作用域。
- PowerShell的
if(外部命令)判断逻辑
当你把外部可执行程序(比如jfrog.exe)直接放在if()的括号中时,PowerShell不会判断命令的执行成功与否,只会判断该命令是否向**标准成功输出流(Success Stream)**返回了内容。
而jfrog config use命令的[Info]、[Error]日志都没有输出到标准成功流,所以无论执行成功还是失败,该命令都不会向标准成功流返回任何内容,if()的判断结果永远为$false,自然两种场景都会进入else分支。 $?变量的正确使用规则$?是PowerShell的执行状态变量,对于外部命令而言,它的取值规则确实是:上一条外部命令退出码为0时返回$true,非0时返回$false。但它只会在对应命令执行完成后更新,不能通过把外部命令直接放入if()来自动读取$?的值。
另外你提到的改法存在语法错误:$LASTEXITCODE=0是赋值操作,会直接把变量设为0,永远返回真,需要用比较运算符-eq做判断。
正确写法
写法1:基于退出码判断(推荐,兼容性更高)
jfrog config use Dummy if ($LASTEXITCODE -eq 0) { Write-Host "Dummy exists" } else { Write-Host "Dummy doesn't exist" }
写法2:基于$?判断
注意$?必须紧跟在要判断的命令之后,中间不能插入任何其他命令,否则值会被覆盖:
jfrog config use Dummy if ($?) { Write-Host "Dummy exists" } else { Write-Host "Dummy doesn't exist" }
内容的提问来源于stack exchange,提问作者Ray Depew
相关产品推荐
相关产品推荐

