仅在写入 cmd /c 之前,批处理文件中的命令才会运行

仅在写入 cmd /c 之前,批处理文件中的命令才会运行

我正在运行以下命令

rabbitmq-server.bat" -detached

此命令在后台运行 sewrver。当我从批处理文件运行它时 - 流程停止,批处理中的后续命令也停止运行。

  1. 为什么?
  2. 运行这些命令的最佳方法是什么?
  3. 使用 cmd /c 运行它们可以完成这项工作,但我不适用于所有这些命令

答案1

这是微软 CMD 为向后兼容而保留的愚蠢行为,一直到微软 COMMAND 的最早版本。如果一个命令脚本运行另一个命令脚本,则第一个命令脚本将被取消。

解决这个问题的方法是使用call内置命令。只需在命令脚本前加上前缀即可call。这将产生您(我想大多数人也这么认为)期望的行为:当被调用的命令脚本终止时,调用命令脚本将恢复执行。

您也可以使用cmd /c,但请注意,这不是一回事。 call只是将命令脚本嵌套在同一个命令解释器中。 cmd /c启动另一个新的命令解释器子进程。 对子进程中的变量、工作目录、打开的文件句柄等所做的更改不会影响其父进程。 相反,call如果使用替换命令解释器,则是可移植的,而cmd将命令解释器绑定到特定的命令解释器。

进一步阅读

  • JP 软件。称呼. 采取命令/TCC 帮助。
  • “称呼”Windows XP 命令行参考 A–Z。 TechNet。微软公司。

答案2

这可能是使用“Start.exe”的情况

“开始”将允许您在单独的窗口中启动服务器进程并保持其运行。

原始批处理脚本将继续执行脚本中的命令,而无需等待服务器进程结束。

虽然这些命令不会影响单独运行的进程,但是很可能您可以在批处理脚本的以下部分中使用一些旨在与正在运行的 Rabit MQ 服务器交互的命令,并且它们将正常运行。

只要您在执行 START 命令和启动客户端命令之间设置足够长的暂停时间,即可为 Rabbit 服务器提供足够的时间进行完全实例化。(这可以通过暂停来完成,您可以手动按 Enter 继续,或者按 ping 来设置计时器。)

使用不带“Start”的“CALL”或“CMD /C”将使批处理脚本等到您结束 RabitMQ 服务器命令的执行后再继续。

相关内容