已经有问题解决了我的问题(我可以让 && 在 Powershell 中工作吗?),但有一个区别。我需要两个命令的输出。看,如果我只是运行:
(command1 -arg1 -arg2) -and (command2 -arg1)
我不会看到任何输出,但会看到 stderr 消息。而且,正如预期的那样,只需键入:
command1 -arg1 -arg2 -and command2 -arg1
给出语法错误。
已经有问题解决了我的问题(我可以让 && 在 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 遇到终止错误时才返回。似乎$?
需要至少三种状态(失败、成功和部分成功)。因此,如果您使用 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}
Powershell 7 preview 5 有它们。我不知道为什么在没有通知或解释的情况下将其删除。 https://devblogs.microsoft.com/powershell/powershell-7-preview-5/ 这将根据问题提供两个命令的输出。
echo 'hello' && echo 'there'
hello
there
echo 'hello' || echo 'there'
hello
简化多步脚本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 [Core] 7.0&&
||
- 请参阅此答案。
Bash 的 /cmd
和&&
控制||
运算符没有 Windows PowerShell 等效项,并且由于您无法定义自定义运算符,因此没有好的解决方法。
| Out-Host
基于 - 的解决方法受到严重限制,因为它只能将正常命令输出发送到控制台(终端),从而防止输出通过管道发送或被捕获在变量或文件中。在此答案中查找背景信息。
更长的路见下文
try {
hostname
if ($lastexitcode -eq 0) {
ipconfig /all | findstr /i bios
}
} catch {
echo err
} finally {}
最简单的解决方案是使用
powershell command1 && powershell command2
在 cmd 外壳中。当然,你不能在 .ps1 脚本中使用它,所以有这个限制。
随着 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 ??=