已经有问题解决我的问题(Can I get && to work in Powershell?),但有一点不同。我需要两个命令的OUTPUT。看,如果我只是运行:
(command1 -arg1 -arg2) -and (command2 -arg1)
我不会看到任何输出,而是stderr消息。正如所料,只需输入:
command1 -arg1 -arg2 -and command2 -arg1
给出语法错误。
试试这个:
$(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}
为了简化doThis ||的多步脚本退出1将非常有用,我使用类似的东西:
function ProceedOrExit {
if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 }
}
doThis; ProceedOrExit
doNext
# or for long doos
doThis
ProceedOrExit
doNext
cmd
的&&
和||
控制运算符没有PowerShell等价物,因为你无法在PowerShell中定义自定义运算符,所以没有好的解决方法。
| Out-Host
中基于Keith Hill's answer的解决方法受到严重限制,因为它只能向控制台(终端)发送正常的命令输出,从而阻止输出通过管道发送或在变量或文件中捕获。在我的this answer中查找背景信息。
最简单的解决方案是使用
powershell command1 && powershell command2
在cmd shell中。当然,您不能在.ps1脚本中使用它,因此存在这种限制。
稍长一点的方法见下文
try {
hostname
if ($lastexitcode -eq 0) {
ipconfig /all | findstr /i bios
}
} catch {
echo err
} finally {}