为什么在Powershell中链接的两个睡眠语句失败?

时间:2019-06-20 19:44:34

标签: powershell

在Win命令行中,您可以执行cmd1 && cmd2,并且只有在cmd2成功的情况下才会执行cmd1。我认为,根据此处的其他答案,powershell等效项将为(cmd1) -and (cmd2)。但是,在测试它时,我会看到奇怪的行为-特别是,当我应该正确时,我会失败。这是一个最小的复制示例。

PS>(Start-Sleep 1)
PS>$?
True
PS>(Start-Sleep 1) -and (Start-Sleep 1)
False
PS>$?
True
PS>$z = (Start-Sleep 1) -and (Start-Sleep 1)
False
PS>$z
False
PS>$?
True

为什么睡眠无法连锁,为什么$z$?不匹配?

2 个答案:

答案 0 :(得分:4)

这些命令没有执行您认为正在执行的操作。您不是在执行两个命令,而是让解释器根据括号中命令的输出来评估两个语句。

在Powershell中,括号用于表示首先执行的语句。 sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) invalid input syntax for type uuid: "<sqlalchemy.engine.result.ResultProxy object at 0x03D165B0>" LINE 2: ...xtra) values ('af80a4fa939511e9b11ec0389662fd98', '<sqlalche... ^ [SQL: insert into events (event_id,user_id,host_id,type,name,location,event_start,event_end,member_count,event_status,description,faq,extra) values ('af80a4fa939511e9b11ec0389662fd98', '<sqlalchemy.engine.result.ResultProxy object at 0x03D165B0>', '<sqlalchemy.engine.result.ResultProxy object at 0x03D16590>', 'hackathon', 'make-a-thon', '{}', '<sqlalchemy.engine.result.ResultProxy object at 0x03D16770>', '<sqlalchemy.engine.result.ResultProxy object at 0x03D16B30>', '300', 'offline', 'growth product is main focus', '{}', '{}'); ] (Background on this error at: http://sqlalche.me/e/9h9h) 将在返回时返回$ NULL,因为在执行过程中或返回时未将任何内容写入缓冲区。 Powershell将$ NULL评估为false,因此在进行Start-Sleep检查时,-and作弊并发现输入为$ false,这可能是为了节省时间。

-and

所以您实际上是在说:

(Start-Sleep -S 1) == $false

当然是$null -and $null 。因为当$false$false一起使用时AND$false

答案 1 :(得分:1)

开始睡眠为$ null。但是$ null-和$ null是$ false。

PS C:\users\js> $a = Start-Sleep 1
PS C:\users\js> $a
PS C:\users\js> $a -eq $null
True
PS C:\users\js> $a -and $a
False
PS C:\users\js> [bool]$a
False
PS C:\users\js> $false -and $false
False

短路。

PS C:\users\js> $true -and (write-host hi)
hi
False
PS C:\users\js> $false -and (write-host hi)
False
PS C:\users\js> $true -or (write-host hi)
True
PS C:\users\js> $false -or (write-host hi)
hi
False

请注意,在PS中,-and和-or具有相同的优先级!