powershell 中的条件执行(&& 和 ||)
-
20-09-2019 - |
题
已经有一个问题解决了我的问题(我可以让 && 在 Powershell 中工作吗?),但有一点不同。我需要一个 输出 来自两个命令。看看,如果我只是跑:
(command1 -arg1 -arg2) -and (command2 -arg1)
我不会看到任何输出,但会看到 stderr 消息。并且,正如预期的那样,只需输入:
command1 -arg1 -arg2 -and command2 -arg1
给出语法错误。
解决方案
<强> 2019 强>:所述Powershell的团队考虑增加用于&&
支持的powershell - 在此GitHub的PR权衡
尝试这种情况:
$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)
在$()
是一个子表达式允许用户指定内包括一个管道多个语句。然后执行命令和管道Out-Host
所以你可以看到它。下一条语句(子表达式的实际输出)应该输出$?
即最后一个命令的成功结果。
在$?
工作正常,本机命令(控制台exe文件的),但它的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
的最简单的解决方案是使用
powershell command1 && powershell command2
在一个cmd壳。当然,你不能在一个名为.ps1脚本中使用此,所以有这个限制。
长一点的方法是查看下面的
try {
hostname
if ($lastexitcode -eq 0) {
ipconfig /all | findstr /i bios
}
} catch {
echo err
} finally {}
不隶属于 StackOverflow