mysql - 如何抑制输出并检查命令是否成功?

标签 mysql windows powershell command-line-interface windows-scripting

我正在尝试编写一个 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/

相关文章:

php - 在模拟器游戏中,mysql中是否存在类似于内存状态的东西?

c - DLL 中的函数未返回正确值

c++ - 构建 Qt-Static 5.3.2 时遇到问题

mysql - 将 SQL VIEW 与 WHERE 子句一起使用(错误)

php - INSERT mySQL DATE 无法使用 PHP 运行

php - Eclipse 问题不断打开文件的旧版本/副本

.net - 有什么方法可以让应用平台的中间代码独立?

powershell - 将字符串数组传递给PowerShell函数

Powershell:将句点分隔的字符串转换为对象属性

php - 两个表值匹配等于一个值