首页 > 解决方案 > 如何抑制输出并检查命令是否成功?

问题描述

我正在尝试编写一个 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!” 就像之前一样。

标签: mysqlwindowspowershellcommand-line-interfacewindows-scripting

解决方案


更新

  • if ($LASTEXITCODE -eq 0) ...方法将继续与外部程序一起稳健地工作。
  • 但是,在PowerShell (Core) 7.2 及更高版本中,if ($?) ...也可以正常工作- 请参阅此答案以获取更多信息。

使用$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 output 的存在推断失败

外部控制台/终端程序仅通过其退出代码传达其成功状态,PowerShell 反映在自动$LASTEXITCODE变量中。

从上面$?可以看出,$false即使退出代码是0,所以它不是一个可靠的成功指标 - 不像$LASTEXITCODE.


推荐阅读