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

3

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


如果将外部应用程序的输出分配给$Var,会发生什么? - Lee_Dailey
mysql 命令之前,您可以执行 $ErrorActionPreference='SilentlyContinue',然后在 Else 脚本块之后将其设置回 $ErrorActionPreference='Continue'。这样可以防止任何错误显示。 - TheMadTechnician
1
@TheMadTechnician - 这会对外部应用程序产生任何影响吗? - Lee_Dailey
@Lee_Dailey 我测试过了,它可以在 cmd.exe /c dir c:\fakefolder 上运行。 - TheMadTechnician
1个回答

4

更新:

  • 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输出来推断失败。外部控制台/终端程序仅通过其退出代码传达其成功状态,PowerShell将反映在自动$LASTEXITCODE变量中。由上述可知,即使退出代码为0,$?也可能为$false,因此它不是一个可靠的成功指标 - 不同于$LASTEXITCODE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接