我正在尝试编写一个 powershell 脚本,通过使用 $?
检查是否发生错误来测试 MySQL 登录是否成功。
我还想从命令中抑制所有输出——成功或不成功。
这些是我尝试过的:
mysql -u root --password=mypass -e "show databases"
If ( $? ) {
echo "Hooray!"
} Else {
echo "Boo!"
}
这可以正常工作但不会抑制任何输出。
mysql -u root --password=mypass -e "show databases" > $null
仍然可以正常工作,但如果密码错误,则不会抑制错误。
mysql -u root --password=mypass -e "show databases" 2> $null
这不能正常工作。在这个例子中,它总是打印“Boo!”
mysql -u root --password=mypass -e "show databases" > $null 2>&1
这会正确抑制所有输出,但只会打印“Boo!”和以前一样。
最佳答案
更新:
if ($LASTEXITCODE -eq 0) ...
方法将继续与外部程序一起稳健地工作。- 但是,在 PowerShell (Core) 7.2 及更高版本中,
if ($?) ...
也能正常工作 - 请参阅 this answer更多信息。
使用 $LASTEXITCODE -eq 0
而不是 $?
可靠地检测外部报告的非零退出代码(通常是信号失败)程序。
然后您可以使用*> $null
明确抑制所有输出,而不必担心该重定向对$?
的影响:
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
使用涉及 PowerShell 错误流的 重定向 - 通过 2>
显式或通过 *>
隐式 - 意味着如果任何数据是通过该流接收 - 在调用外部程序的情况下,这意味着 stderr 的任何输出 - PowerShell 将 $?
设置为 $false
。
但是,在外部控制台/终端程序领域,stderr 不仅用于输出错误 信息,还用于输出任何不是数据 的信息,例如作为状态信息。因此,您不能根据 stderr 输出的存在推断故障。
外部控制台/终端程序仅通过它们的退出代码传达它们的成功状态,PowerShell 将其反射(reflect)在自动 $LASTEXITCODE
变量中。
从上面可以看出,即使退出代码是0
,$?
也可以是$false
,所以它不是' 一个可靠的成功指标 - 与 $LASTEXITCODE
不同。
关于mysql - 如何抑制输出并检查命令是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622596/