42

已经有问题解决了我的问题(我可以让 && 在 Powershell 中工作吗?),但有一个区别。我需要两个命令的输出。看,如果我只是运行:

(command1 -arg1 -arg2) -and (command2 -arg1)

我不会看到任何输出,但会看到 stderr 消息。而且,正如预期的那样,只需键入:

command1 -arg1 -arg2 -and command2 -arg1 

给出语法错误。

4

7 回答 7

41

2019 年:Powershell 团队正在考虑增加对&&Powershell 的支持——在这个 GitHub PR 上权衡一下

试试这个:

$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)

$()是一个子表达式,允许您在包括管道的情况下指定多个语句。然后执行命令和管道,Out-Host以便您可以看到它。下一条语句(子表达式的实际输出)应该输出$?即最后一个命令的成功结果。


对于本$?机命令(控制台 exe)来说效果很好,但对于 cmdlet,它还有一些不足之处。也就是说,$?似乎仅$false在 cmdlet 遇到终止错误时才返回。似乎$?需要至少三种状态(失败、成功和部分成功)。因此,如果您使用 cmdlet,这会更好:

$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and 
$(command -arg1 -ev err | Out-Host;!$err)

这种打击还在。也许这样的事情会更好:

function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
    foreach ($sb in $scriptblock)
    {
        $prevErr = $error[0]
        . $sb
        if ($error[0] -ne $prevErr) { break }
    }
}

ExecuteUntilError {command -arg1 -arg2},{command2-arg1}
于 2010-02-12T15:13:31.090 回答
6

Powershell 7 preview 5 有它们。我不知道为什么在没有通知或解释的情况下将其删除。 https://devblogs.microsoft.com/powershell/powershell-7-preview-5/ 这将根据问题提供两个命令的输出。

echo 'hello' && echo 'there'
hello
there

echo 'hello' || echo 'there'
hello
于 2019-11-19T02:40:28.820 回答
3

简化多步脚本doThis || 出口 1将非常有用,我使用类似的东西:

function ProceedOrExit { 
    if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 } 
}

doThis; ProceedOrExit
doNext

# or for long doos
doThis
ProceedOrExit
doNext
于 2013-11-26T09:38:42.957 回答
2

更新:引入支持PowerShell [Core] 7.0&&|| - 请参阅此答案


Bash 的 /cmd&&控制||运算符没有 Windows PowerShell 等效项,并且由于您无法定义自定义运算符,因此没有好的解决方法

  • Keith Hill 的答案| Out-Host基于 - 的解决方法受到严重限制,因为它只能将正常命令输出发送到控制台(终端),从而防止输出通过管道发送或被捕获在变量或文件中。

在此答案中查找背景信息。

于 2017-01-21T21:19:21.930 回答
0

更长的路见下文

try {
  hostname
  if ($lastexitcode -eq 0) {
    ipconfig /all | findstr /i bios
  }
} catch {
  echo err
} finally {}
于 2017-01-21T16:52:11.333 回答
0

最简单的解决方案是使用

powershell command1 && powershell command2

在 cmd 外壳中。当然,你不能在 .ps1 脚本中使用它,所以有这个限制。

于 2017-12-14T02:46:25.927 回答
0

随着 Powershell 7.0 的发布,&&||得到支持

https://devblogs.microsoft.com/powershell/announcing-powershell-7-0/

New operators:
  Ternary operator: a ? b : c
  Pipeline chain operators: || and &&
  Null coalescing operators: ?? and ??=
于 2020-03-14T04:39:41.073 回答