我正在尝试编写一个 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!”像以前一样。
Update:
- The
if ($LASTEXITCODE -eq 0) ...
该方法将继续与外部计划强有力地合作。
- 然而,在PowerShell(核心)7.2及以上,
if ($?) ...
工作也很稳健 - see 这个答案 https://stackoverflow.com/a/66726535/45375了解更多信息。
Use $LASTEXITCODE -eq 0
而不是$?
可靠地检测非零退出代码(通常是信号故障)由外部程序报告。
那么你可以use *> $null
彻底抑制所有输出不必担心重定向的影响$?
:
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Using 涉及 PowerShell 错误流的重定向 - 显式通过2>
或隐式地通过*>
- 意味着如果通过该流接收到任何数据 - 在调用外部程序的情况下意味着任何输出stderr - PowerShell 集$?
to $false
.
然而,在外部控制台/终端程序领域,stderr 不仅仅用于输出error信息,但任何不属于的信息data,例如状态信息。所以,您无法从 stderr 输出的存在推断失败.
外部控制台/终端程序仅通过其退出代码,PowerShell 反映在自动$LASTEXITCODE
多变的。
由上可知$?
can be $false
即使退出代码是0
,所以它不是一个可靠的成功指标 - 与$LASTEXITCODE
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)