我正在尝试编写一个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
这将正确地抑制所有输出,但仅打印“嘘!”。像以前一样。
答案 0 :(得分:2)
使用$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不仅用于输出 error 信息,而且还用于输出不是 data 的信息。作为状态信息。因此,您不能从stderr输出的存在来推断故障。
外部控制台/终端程序仅通过其退出代码传达其成功状态,PowerShell会在自动$LASTEXITCODE
变量中反映出它们的成功状态。
从上面可以得出,即使退出代码为$?
,$false
也可以是0
,所以它不是可靠的成功指示符-与$LASTEXTICODE
不同。