什么是Bash的&&和||的PowerShell等价物 运营商?

And*_*ehm 30 bash powershell language-comparisons

在Bash中,我可以轻松地做类似的事情

command1 && command2 || command3
Run Code Online (Sandbox Code Playgroud)

这意味着运行command1,如果command1成功运行command2,并且command1无法运行command3.

什么是PowerShell中的等价物?

mkl*_*nt0 26

问题首次提出许多年后,让我总结一下PowerShell v5.1的现状:

  • bash的/ &&||cmd控制运营商没有PowerShell的等价物,因为你不能在PowerShell中定义运营商定制,有没有很好的解决方法:

    • 使用单独的命令(在单独的行上或用其分隔&&),并通过自动变量显式测试每个命令的成功状态||,例如:
      ;
      $?

    • 请参阅下文,了解PowerShell的原因command1 -arg1 -arg2; if ($?) { command2 -arg1 } # equivalent of &&并且command1 -arg1 -arg2; if (-not $?) { command2 -arg1 } # equivalent of ||通常不是解决方案.

  • 谈论将它们添加而回,但它似乎从来没有在列表的顶部.

    • 现在PowerShell已经开源了,GitHub上已经打开了一个问题.
    • 令牌-and-or目前保留供PowerShell以后使用,所以希望可以实现与Bash相同的语法.
      (从PSv5.1开始,尝试类似于&&yield错误消息||)

为什么选择PowerShell 1 && 1并且The token '&&' is not a valid statement separator in this version.无法替代-and-or:

Bash的控制操作符&&(短路逻辑AND)和||(短路逻辑OR)通过退出代码隐式检查命令的成功状态,而不会干扰它们的输出流 ; 例如:

ls / nosuchfile && echo 'ok'
Run Code Online (Sandbox Code Playgroud)

无论&&输出-标准输出输出(在文件中||)和stderr输出(从试图访问不存在的文件的错误信息ls) -被穿过,但/检查(不可见)退出代码的的nosuchfile命令,如果确定&&命令- ls应执行控制操作员的RHS .

echo&&在这种情况下报告退出代码,信号失败 - 因为文件ls不存在 - 因此1决定nosuchfile 失败,并通过应用短路,决定&&不需要执行命令.
请注意,这是退出代码ls,在世界成功的信号echo0,而任何非零退出代码指示失败.

换句话说:Bash cmd.exebash完全独立于命令输出操作,并且只对命令的成功状态起作用.


Powershell的&&||,与此相反,仅作用于命令标准(成功)输出,消费,然后仅输出操作的布尔结果 ; 例如:

(Get-ChildItem \, nosuchfile) -and 'ok'
Run Code Online (Sandbox Code Playgroud)

以上:

  • 使用和消耗成功(标准)输出-列表的-and-并且其解释为布尔 ; -or在布尔上下文中考虑非空输入集合,因此如果至少有一个条目,则表达式求值为\.

    • 但是,由不存在的文件导致的错误信息将$true 传递,因为错误被发送到单独的流.
  • 鉴于$true返回非空成功输出,LHS计算得到nosuchfile,因此Get-ChildItem \, nosuchfile也评估RHS,$true但是,再次消耗其输出并将其解释为布尔值,作为非空字符串,它也计算为-and.

  • 因此,'ok'表达式的总体结果$true是(唯一成功的)输出.

净效应是:

  • 表达式两侧的成功输出在评估期间消耗,因此被有效隐藏.-and

  • 表达式的唯一(成功)输出是其布尔结果,$true在这种情况下(-and在英语系统的终端中呈现).

  • 巨大的hack,但是我需要一个内联调用,并且无法添加函数。因此,我最终得到了这样的内容:`command1; $?-或(command3)` (2认同)

Jam*_*ack 9

Bash必须做的是在传递给逻辑运算符时将命令的退出代码隐式地转换为布尔值.PowerShell不会这样做 - 但可以使用函数来包装命令并创建相同的行为:

> function Get-ExitBoolean($cmd) { & $cmd | Out-Null; $? }
Run Code Online (Sandbox Code Playgroud)

($?是包含最后退出代码成功的bool)

给出两个批处理文件:

#pass.cmd
exit
Run Code Online (Sandbox Code Playgroud)

#fail.cmd
exit /b 200
Run Code Online (Sandbox Code Playgroud)

......行为可以测试:

> if (Get-ExitBoolean .\pass.cmd) { write pass } else { write fail }
pass
> if (Get-ExitBoolean .\fail.cmd) { write pass } else { write fail }
fail
Run Code Online (Sandbox Code Playgroud)

应该像在Bash中一样评估逻辑运算符.首先,设置别名:

> Set-Alias geb Get-ExitBoolean
Run Code Online (Sandbox Code Playgroud)

测试:

> (geb .\pass.cmd) -and (geb .\fail.cmd)
False
> (geb .\fail.cmd) -and (geb .\pass.cmd)
False
> (geb .\pass.cmd) -and (geb .\pass.cmd)
True
> (geb .\pass.cmd) -or (geb .\fail.cmd)
True
Run Code Online (Sandbox Code Playgroud)

  • 那么这个没有简单的内置功能吗? (12认同)
  • 需要说明的是,`Get-ExitCodeBoolean()`是_not_是`&&`/`||`的通用替代,因为它会压缩常规输出_,阻止它在变量/文件中捕获/通过管道发送它.Bash的`&&` /`||`控制操作符的美妙之处在于它们不会干扰输出流,只会对(不可见的)退出代码进行操作 - 并且不能(当前)在PowerShell中完成.如果您认为应该,[在此投票](https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11087898-implement-the-and-operators-that-bash-has). (4认同)
  • 不,不要这么认为.我相信设计师会尽力避免像这样的操作员劫持使用.事实上,也没有三元运营商.然而,它足够强大,可以提供轻松自己滚动的方法.http://blogs.msdn.com/powershell/archive/2006/12/29/dyi-ternary-operator.aspx (3认同)
  • @JamesKolpack:语言中没有`&&` / `||` 和三元条件运算符的唯一原因是_它们从未出现在列表的顶部 - 两者都被认为是潜在有用的补充_:见[here](http://stackoverflow.com/a/573295/45375) for `&&` / `||`,并且,关于三元运算符,您链接到的文章以“其中一件事”开头我们对无法在 V1.0 中发布三元运算符感到非常失望。” (2认同)