Bash';标准普尔&;和| |运算符?

Bash';标准普尔&;和| |运算符?,bash,powershell,language-comparisons,Bash,Powershell,Language Comparisons,在Bash中,我可以轻松地执行以下操作 command1 && command2 || command3 这意味着运行command1,如果command1成功运行command2,如果command1未能运行command3 PowerShell中的等价物是什么?Bash必须做的是在传递给逻辑运算符时将命令的退出代码隐式转换为布尔值。PowerShell不会这样做-但是可以使用一个函数包装命令并创建相同的行为: > function Get-ExitBoolean($c

在Bash中,我可以轻松地执行以下操作

command1 && command2 || command3
这意味着运行command1,如果command1成功运行command2,如果command1未能运行command3


PowerShell中的等价物是什么?

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

> function Get-ExitBoolean($cmd) { & $cmd | Out-Null; $? }
()

给定两个批处理文件:

#pass.cmd
exit

…可以测试该行为:

> if (Get-ExitBoolean .\pass.cmd) { write pass } else { write fail }
pass
> if (Get-ExitBoolean .\fail.cmd) { write pass } else { write fail }
fail
逻辑运算符的计算方法应与Bash中的相同。首先,设置别名:

> Set-Alias geb Get-ExitBoolean
测试:


我们可以在powershell中使用try-catch-finally方法,而不是使用&&method

try {hostname} catch {echo err} finally {ipconfig /all | findstr bios}
更新:
&&
|
终于来到了PowerShell
(核心),即在v7;看


在第一次提出这个问题多年后,让我总结一下自PowerShell v5.1以来的情况:

  • Bash的/
    cmd
    &&
    |
    控制运算符没有与PowerShell等效的
    ,而且由于您无法在PowerShell中定义自定义运算符,因此没有很好的解决方法

    • 使用单独的命令(在单独的行上或用
      分隔),并通过自动变量
      $?
      明确测试每个命令的成功状态,例如:
      command1-arg1-arg2;if($?){command2-arg1}等价于&

      command1-arg1-arg2;if(-not$?){command2-arg1}等于|

    • 有关PowerShell的
      -和
      -或
      通常不是解决方案的原因,请参见下文

  • 不久前有,但它似乎从未登上榜首

    • 现在PowerShell已经开放源代码,是一个
    • 令牌
      &&
      |
      目前保留在PowerShell中供将来使用,因此希望可以实现与Bash相同的语法。
      (从PSv5.1开始,尝试类似于
      1&&1
      的操作会产生错误消息
      标记“&&&”在此版本中不是有效的语句分隔符。

为什么PowerShell的
-和
-或
不能替代
&
|
Bash的控制运算符
&&
(短路逻辑AND)和
|
(短路逻辑OR)通过退出代码隐式地检查命令的成功状态,而不干扰其输出流;e、 g:

ls / nosuchfile && echo 'ok'
(Get-ChildItem \, nosuchfile) -and 'ok'
任何
ls
输出都会被传递,但
和&
会检查(不可见的)输出(stdout输出(在
/
中的文件)和stderr输出(试图访问不存在的文件
nosuchfile
)的错误消息)退出
ls
命令的代码,以决定是否应执行
echo
命令(控制操作员的RHS)

ls
报告退出代码
1
在这种情况下,信号失败——因为文件
nosuchfile
不存在——因此
和&
决定
ls
失败,通过应用短路,决定不需要执行
echo
命令。
请注意,退出代码
0
表示在
cmd.exe
bash
的世界中成功,而任何非零的退出代码都表示失败

换句话说:Bash的
&&
|
完全独立于命令的输出运行,并且只对命令的成功状态起作用。


相比之下,PowerShell的
-和
-或
仅对命令的标准(成功)输出起作用,使用它,然后仅输出操作的布尔结果;e、 g:

ls / nosuchfile && echo 'ok'
(Get-ChildItem \, nosuchfile) -and 'ok'
上述:

  • 使用并使用success(标准)输出--
\
列表--并将其解释为布尔值;在布尔上下文中,非空输入集合被视为
$true
,因此如果至少有一个条目,则表达式的计算结果为
$true

  • 但是,由于错误被发送到一个单独的流,因此通过传递由不存在的文件
    nosuchfile
    产生的错误信息
  • 假定
    Get ChildItem\,nosuchfile
    返回非空的成功输出,LHS计算为
    $true
    ,因此
    -和
    也计算RHS,
    'ok'
    ,但再次使用其输出并将其解释为布尔值,作为非空字符串,也计算为
    $true

  • 因此,
    -和
    表达式的总体结果是
    $true
    ,这是(唯一成功的)输出

  • 净效应是:

    • 来自
      -和
      表达式两侧的成功输出在求值过程中消耗,因此有效隐藏

    • 表达式的唯一(成功)输出是其布尔结果,在本例中为
      $true
      (在终端中呈现为
      true


    您可以这样做,使用[void]隐藏布尔输出,只会得到副作用。在这种情况下,如果$a或$b为空,那么$c将被分配给$result。赋值可以是表达式

    $a = ''
    $b = ''
    $c = 'hi'
    
    [void](
      ($result = $a) -or
      ($result = $b) -or
      ($result = $c))
    
    $result
    
    输出

    hi
    

    ?Stej,你做到了-写你自己的有趣方法。2019年6月更新:PowerShell团队正在实施
    &&
    |
    !在称重时进行称重,因此th没有简单的内置功能