三元比较输出新值

Ternary comparison outputs new value

PS C:\Users\Scott> $openlog = "YES"
PS C:\Users\Scott> ($openlog -eq "YES") ? ($openlog = "NO") : ($openlog = "YES")
NO
PS C:\Users\Scott> ($openlog -eq "YES") ? ($openlog = "NO") : ($openlog = "YES")
YES
PS C:\Users\Scott> ($openlog -eq "YES") ? ($openlog = "NO") : ($openlog = "YES")
NO
PS C:\Users\Scott> ($openlog -eq "YES") ? ($openlog = "NO") : ($openlog = "YES")
YES
PS C:\Users\Scott>

这有效,即它切换值,但它也将它写入控制台。为什么?在不使用 | Out-Null?

的情况下,如何正确执行此操作而不输出新值

您可以使用下面的设置变量而不输出到控制台。

$openlog = $openlog -eq "YES" ? "NO" : "YES"

我还不知道为什么你的例子输出到控制台。我检查了 implementation,这是一个从未处理过且在测试期间未处理的用例。

更新:如下 mklement0 所述

enclosing an assignment in (...) passes the value being assigned through

为您的用例提供最佳解决方案,绕过 您的代码问题:

至于:

it also writes it to the console. Why?

PowerShell 允许您将 赋值 用作 表达式 ,方法是将它们包含在 (...), grouping operator:

也就是说,类似($var = 'foo')的东西也输出被分配的值,除了分配给变量$var:

PS> ($var = 'foo')
foo

也就是说,该值输出到 PowerShell 的 成功输出流 (请参阅概念性 about_Redirection 帮助主题),默认情况下输出到主机(控制台) .