powershell中的条件执行(&&和||)

问题描述 投票:28回答:5

已经有问题解决我的问题(Can I get && to work in Powershell?),但有一点不同。我需要两个命令的OUTPUT。看,如果我只是运行:

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

我不会看到任何输出,而是stderr消息。正如所料,只需输入:

command1 -arg1 -arg2 -and command2 -arg1 

给出语法错误。

syntax powershell command-execution
5个回答
28
投票

试试这个:

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

$()是一个子表达式,允许您在包含管道的内部指定多个语句。然后执行命令并管道到Out-Host,这样你就可以看到它。下一个语句(子表达式的实际输出)应该输出$?,即最后一个命令的成功结果。


$?适用于本机命令(控制台exe),但对于cmdlet,它留下了一些需要的东西。也就是说,当cmdlet遇到终止错误时,$?似乎只返回$false。似乎$?需要至少三个状态(失败,成功和部分成功)。因此,如果您使用的是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}

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

1
投票
  • Bash / cmd&&||控制运算符没有PowerShell等价物,因为你无法在PowerShell中定义自定义运算符,所以没有好的解决方法。 | Out-Host中基于Keith Hill's answer的解决方法受到严重限制,因为它只能向控制台(终端)发送正常的命令输出,从而阻止输出通过管道发送或在变量或文件中捕获。

在我的this answer中查找背景信息。


0
投票

最简单的解决方案是使用

powershell command1 && powershell command2

在cmd shell中。当然,您不能在.ps1脚本中使用它,因此存在这种限制。


0
投票

稍长一点的方法见下文

try {
  hostname
  if ($lastexitcode -eq 0) {
    ipconfig /all | findstr /i bios
  }
} catch {
  echo err
} finally {}
© www.soinside.com 2019 - 2024. All rights reserved.