【发布时间】:2021-09-13 18:30:19
【问题描述】:
我想编写一个 PowerShell 脚本来选择 JFrog 服务连接,但该脚本的行为与我期望的不同。
当我手动运行jfrog config use 命令时,它按预期工作:
PS C:\Users\rdepew> jfrog config use Dummy
[Info] Using server ID 'Dummy' (https://foo.jfrog.io/).
PS C:\Users\rdepew> $?
True
我希望能够使用始终返回 true 或 false 的 $? 来检测 jfrog config use 是否已成功执行。这个 sn-p 说明了我遇到的问题:
PS C:\Users\rdepew> if (jfrog config use Dummy) {
>> Write-Host Dummy exists
>> } else {
>> Write-Host Dummy doesnt exist but I dont believe it
>> }
[Info] Using server ID 'Dummy' (https://foo.jfrog.io/).
Dummy doesnt exist but I dont believe it
[Info] 行表明 JFrog 实际上正在使用服务器连接“Dummy”。我假设 $?退出代码评估为真,就像在我的手动执行中一样。但我的 if/else 测试采用“if false”分支。为什么?
更多信息:如果我使用不存在的服务连接的名称,我会得到预期的行为:
PS C:\Users\rdepew> if (jfrog config use Bogus) {
>> Write-Host Bogus exists
>> } else {
>> Write-Host Bogus doesnt exist
>> }
[Error] Could not find a server with ID 'Bogus'.
Bogus doesnt exist
我不明白为什么 PS 在 True 和 False 情况下都跳到 else 子句。
更多信息
感谢第一个答案和cmets,我明白了一点。我可以像这样重写我的 sn-p:
jfrog config add Dummy
if ($LASTEXITCODE=0) {
etc.
但我仍然对 $ 感到困惑?行为。从命令行,$?行为如下:
PS C:\Users\rdepew> jfrog config use Dummy
[Info] Using server ID 'Dummy' (https://foo.jfrog.io/).
PS C:\Users\rdepew> $?
True
PS C:\Users\rdepew> jfrog config use Bogus
[Error] Could not find a server with ID 'Bogus'.
PS C:\Users\rdepew> $?
False
...这是人们所期望的。
【问题讨论】:
-
$?告诉您最后一个命令是否成功完成。仅当jfrog config use Dummy将任何对象/字符串返回到成功流时,if (jfrog config use Dummy)才会为真 -
@Daniel 这实际上不是真的。如果最后一个命令是外部命令并且
$LASTEXITCODE的值为0,$?应该返回$?$?应该返回$False任何其他值。 -
@BendertheGreatest,我明白了。在大多数情况下,这不是基本相同的吗?本地应用程序通常使用 $LASTEXITCODE 0 来表示成功,而任何其他代码都表示失败。我知道并非所有应用程序都严格遵守这一点,但在大多数情况下,这是意料之中的。无论如何,我的观点是
$?和if (jfrog config use Dummy)不是一回事。后者仅当在成功流中接收到对象时才会返回 true,并且与命令是否成功无关。 -
我完全误读了您的第一条评论,我的错。我以为你说 cmdlet 不是命令
-
(快速搜索“成功流”)哦!因此,如果 jfrog 在错误流上输出其错误消息,则一切都按预期进行。如果 jfrog 在 Success 流上输出它的 Info 消息,那么一切都会按预期运行。但是,如果 jfrog 在信息流(因此,
Info)而不是成功流上输出其信息消息,则可能会导致我看到的行为。对吗?
标签: powershell exit-code jfrog-cli jfrog