【问题标题】:How to run multiple services from .bat file如何从 .bat 文件运行多个服务
【发布时间】:2021-06-01 19:21:50
【问题描述】:

我想从 bat 文件运行 selenium 服务器。表示启动集线器和集线器下的两个节点。在 Ubuntu 上,我有这个脚本可以做到这一点:

  java -jar $jarFilePath -role hub & 
  java -jar $jarFilePath -role node -hub http://173.249.58.30:4444/grid/register/ & 
  java -jar $jarFilePath -role node -hub http://173.249.58.30:4444/grid/register/ & 
  exit 0

有必要用 & 链接它,因为第一个命令仍在运行并且不会运行下一个命令。但在 Windows 上,由于某些原因,这不起作用。我为 Win 找到了类似的东西,但仍然没有成功。它打开三个终端,但节点无法注册到集线器:

start cmd.exe /k "cd c:\Program Files\Selenium\Server & java -jar selenium-server-standalone-3.141.59.jar -role hub"

start cmd.exe /k "cd c:\Program Files\Selenium\Server & java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/" 
start cmd.exe /k "cd c:\Program Files\Selenium\Server & java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/" 

感谢您的帮助。

【问题讨论】:

  • 我的假设,@CD /D "C:\Program Files\Selenium\Server"start java.exe -role hub<possibly some wait mechanism>java.exe -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/
  • 这是什么@CD /D?节点能够以 5 秒的周期尝试连接。不需要使用wait。
  • 打开命令提示符窗口,输入cd /?,按[ENTER] 键,然后读取输出。

标签: windows batch-file terminal terminal-services


【解决方案1】:

您的命令失败的原因是必须引用带有空格的路径(空格是标记分隔符)。

但以下仍然会失败,因为引号不能嵌套,所以 & 没有被引用,并且初始批处理解析器将该行视为两个连接的命令,而不是单个 start 命令。

比如看第一行,这样不行

start cmd.exe /k "cd "c:\Program Files\Selenium\Server" & java -jar selenium-server-standalone-3.141.59.jar -role hub"

要解决上述问题,很多人会逃避&

start cmd.exe /k "cd "c:\Program Files\Selenium\Server" ^& java -jar selenium-server-standalone-3.141.59.jar -role hub"

但我更喜欢转义最外面的引号,这样我就可以编写命令,就像我自己在命令提示符中键入它们一样

start cmd.exe /k "cd ^"c:\Program Files\Selenium\Server" & java -jar selenium-server-standalone-3.141.59.jar -role hub^"

请注意,cd 默认情况下不会更改您的活动驱动器。所以说你的活动驱动器是D:,那么上面的仍然行不通。您必须使用cd /d "c:\Program Files\Selenium\Server",或者pushd "c:\Program Files\Selenium\Server"

但在start 命令之前cd /dpushd 可能更简单,因此您只需执行一次。 STARTed 进程继承父进程的环境。

服务终止后,子进程不需要保持打开状态,所以最好使用cmd /c而不是cmd /k

您的完整脚本可能是

@echo off
pushd "c:\Program Files\Selenium\Server"
start cmd.exe /c "java -jar selenium-server-standalone-3.141.59.jar -role hub"
start cmd.exe /c "java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/" 
start cmd.exe /c "java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/" 
popd

但我不确定您是否真的需要在 cmd.exe 内显式运行 java。您也许可以简单地使用以下内容

@echo off
pushd "c:\Program Files\Selenium\Server"
start java -jar selenium-server-standalone-3.141.59.jar -role hub
start java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/
start java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.137.1:4444/grid/register/
popd

最后,您可能不需要为每个进程设置单独的窗口,在这种情况下,您可以将/B 选项添加到START 命令。紧跟在start之后。

【讨论】:

  • 有些人认为 "title" is important 即使是空的,例如作为START "" …?
  • @JosefZ - 是的,我几乎在我的回答中包含了对它的引用。 start 的第一个参数如果被引用则被视为标题。所以如果你是starting 的命令必须被引用,那么你必须在命令参数之前加上一个引用的标题参数(空引用的字符串很好)
  • 另外……只是语义……就 Windows 而言,这些不是 服务。只是处理。
  • 是的,它有效。也不需要使用cmd.exe。非常感谢。上帝保佑你!