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

时间:2019-04-10 23:21:59

标签: 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

这将正确地抑制所有输出,但仅打印“嘘!”。像以前一样。

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不同。