用于发送命令以正常关闭多个 Spigot Minecraft 服务器的批处理脚本

问题描述 投票:0回答:3

我想知道是否可以让 Windows 批处理脚本将命令发送到三个已经运行的 .jar 文件实例。 在这种情况下,打开的 .jar 文件对应于一个 bungeeCord 实例、一个 survival 实例和一个 hub 实例。每一个 这些 .jar 实例一起构成了整个 Spigot Minecraft 服务器。 (看图片)

目前,为了正常关闭每个服务器/.jar 实例,您需要手动输入“停止” 在 survivalhub 实例的命令行界面中输入命令。你必须输入“end”才能关闭 优雅地创建 bungeeCord 实例。

为了自动化此过程,我想编写一个批处理脚本,允许我发送 'stop''end' 命令 一键访问当前正在运行的 .jar 实例,而不必在每个 .jar 上手动键入每个命令 实例。

实际上我已经通过编写以下批处理脚本成功地自动启动了每个 .jar 实例进程 这可能有帮助:

echo off

cd D:\Projects\Servers\"CRAFT412 Server Desktop"\BungeeCord
start "BungeeCord" java -Xms512M -Xmx512M -jar BungeeCord.jar

cd D:\Projects\Servers\"CRAFT412 Server Desktop"\hub
start "hub" java -Xms512M -Xmx1G -XX:+UseConcMarkSweepGC -jar spigot.jar

cd D:\Projects\Servers\"CRAFT412 Server Desktop"\survival
start "survival" java -Xms512M -Xmx1G -XX:+UseConcMarkSweepGC -jar spigot.jar

运行此脚本后,所有三个必需的 .jar 实例都会打开并运行,如上图所示。

如果您还可以看到文件夹结构,这也可能会有所帮助,因此我提供了该图像:

start.bat 文件对应于上面的代码,用于启动所有三个 .jar 实例。

如有任何帮助,我们将不胜感激。

谢谢。

batch-file jar minecraft bukkit
3个回答
2
投票

请勿使用

taskkill
,杀死进程结果数据丢失!
我发现了一个名为 SendMessage 的好工具,它可以将密钥发送到进程。我编写了一个小批处理脚本,但它有一些错误,并且我找不到这些错误的来源,但是如果您修复代码,您就会有一个可以解决您的问题的工作批处理脚本。 (我知道我不应该发布不起作用的代码作为答案,但它包含逻辑,您可以根据需要形成此代码。)

@echo off
cls

::Declare servers by title
::For BungeeCord servers add "BCS" prefix
set servers[0]=BCStest1 
set servers[1]=test2
set servers[2]=test server

::Servers in the array minus 1
set len=2
::Loop trought the servers
for /l %%s in (0,1,%len%) do (
    ::Set the server variable to the current server, depending on the loop number
    set server=%servers[%%s]%
    
    ::Testing for the server type
    if "BCS"=="%server:~0,3%" (
    ::If it's a BungeeCord server
    
        ::Removing the prefix
        set server=%server:~3%
        
        ::Sending shutdown command
        echo Sending shutdown command to server: %server%
        
        ::e
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:101 /lparam:1
        ::n
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:110 /lparam:1
        ::d
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:100 /lparam:1
        :: ENTER
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:13 /lparam:1
    
    ) else (
    ::If it's a normal server
    
        ::Sending shutdown command
        echo Sending shutdown command to server: %server%
        
        ::s
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:115 /lparam:1
        ::t
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:116 /lparam:1
        ::o
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:111 /lparam:1
        ::p
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:112 /lparam:1
        :: ENTER
        SendMessage-1.1.2.exe /windowtitle:%server% /message:WM_CHAR /wparam:13 /lparam:1
    )
)

::If the execution gets here it was successfull
echo Stop command was sent to all server!
pause

(抱歉,我很久以前就使用过批处理,这就是我无法提供完整工作代码的原因。) 并且不要忘记下载

SendMessage-1.1.2.exe
并将其放入与 *.bat 文件相同的目录中!


0
投票

尝试这样的事情:

@echo off
taskkill /F /IM java.exe

或者您命名所有服务器,例如 server(在启动脚本中使用 title Server) 然后

@echo off
taskkill /F /IM java.exe /FI "Server"

您还可以将服务器命名为

  1. 服务器 - CityBuild

  2. 服务器 - 大厅 ...

然后使用

@echo off
taskkill /F /IM java.exe /FI "Server*"

0
投票

这太棒了,SendMessage 正是我所需要的

© www.soinside.com 2019 - 2024. All rights reserved.