代码之家  ›  专栏  ›  技术社区  ›  Andrew J. Brehm

什么是与bash的&&和运算符等价的PowerShell?

  •  24
  • Andrew J. Brehm  · 技术社区  · 15 年前

    在巴什我可以很容易地做一些像

    command1 && command2 || command3
    

    这意味着运行command1,如果command1成功运行command2,如果command1失败运行command3。

    PowerShell中的等效项是什么?

    3 回复  |  直到 7 年前
        1
  •  8
  •   James Kolpack    15 年前

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

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

    ( $? is a bool containing the success of the last exit code )

    给定两个批处理文件:

    #pass.cmd
    exit
    

    #fail.cmd
    exit /b 200
    

    …行为可以测试:

    > 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
    

    测试:

    > (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
    
        2
  •  20
  •   Community CDub    8 年前

    在这个问题被问了很多年之后,让我总结一下 从PowerShell v5.1开始的状态 以下内容:

    • 巴什/ cmd && || 控件运算符没有PowerShell等效项 ,由于无法在PowerShell中定义自定义运算符,因此 没有好的解决办法 :

      • 使用单独的命令(在单独的行上或用 ; )并通过自动变量显式测试每个命令的成功状态 $? ,例如:
        command1 -arg1 -arg2; if ($?) { command2 -arg1 } # equivalent of &&
        command1 -arg1 -arg2; if (-not $?) { command2 -arg1 } # equivalent of ||

      • 请参阅以下内容了解PowerShell的原因 -and -or 一般是 解决办法。

    • talk about adding them 不久前,它似乎从未登上榜首。

      • 既然PowerShell已经开放源代码了, issue has been opened on GitHub .
      • 令牌 && γ 目前保留供将来在PowerShell中使用,因此希望可以实现与bash中相同的语法。
        (从PSV5.1开始,尝试 1 && 1 生成错误消息 The token '&&' is not a valid statement separator in this version. )

    为什么选择PowerShell -和 -或 不能替代 && γ 以下内容:

    猛击 的控制运算符 && (短路逻辑与)和 γ (短路逻辑或)隐式 通过命令的退出代码检查命令的成功状态, 不会干扰它们的输出流 例如:

    ls / nosuchfile && echo 'ok'
    

    无论什么 ls 输出——两个stdout输出(中的文件 / )和stderr输出(尝试访问不存在文件的错误消息 nosuchfile ——是 通过 但是 && 检查(不可见) 退出代码 负载感应 命令决定 echo 命令-右侧 && 控制操作员-应执行。

    负载感应 报告退出代码 1 在这种情况下,发出信号 失败 --因为文件 不合格 不存在——所以 && 决定 LS 失败 并且,通过应用短路,决定 回声 不需要执行命令。
    注意这是退出代码 0 这标志着世界的成功 cmd.exe bash 而任何 非零 退出代码表示失败。

    换言之: 巴什的 && γ 完全独立于命令操作 输出 只在 成功状况 命令。


    动力壳 -和 -或 相反,只按照命令的标准(成功)操作。 输出 , 消费 然后 只输出操作的布尔结果 例如:

    (Get-ChildItem \, nosuchfile) -and 'ok'
    

    以上:

    • 使用 消费 这个 成功 (标准)输出——列表 \ --并将其解释为 布尔 ;考虑非空输入集合 $true 在布尔上下文中,因此如果至少有一个条目,则表达式的计算结果为 $真 .

      • 然而, 错误 由不存在的文件产生的信息 原始文件 传递,因为错误被发送到单独的流。
    • 鉴于 Get-ChildItem \, nosuchfile 返回非空的成功输出,lhs的计算结果为 $真 如此 -和 还评估了RHS, 'ok' 但是,再一次, 消耗 它的输出并将其解释为布尔值,作为非空字符串,它的计算结果也为 $真 .

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

    这个 净效应 是:

    • 这个 成功产出 -和 表达式是 消耗 在评估期间,因此 有效地 隐藏的 .

    • 表达式的唯一(成功)输出是其布尔结果 ,这就是 真的吗? 在这种情况下(呈现为 True 在英语系统的终端中)。

        3
  •  0
  •   Arount    7 年前

    我们可以在PowerShell中使用Try-Catch Finally方法,而不是使用&方法。

    try {hostname} catch {echo err} finally {ipconfig /all | findstr bios}
    
    推荐文章