使 discord bot 使用 node.js 和子进程正确打开 .bat 文件

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

我不是程序员,我对任何有关代码的知识都一无所知。然而,我真的很想做这件事,所以我的手有点脏。 让我告诉你,有一个 js 代码使用 discord.js、node.js 和子进程模块来让 discord 机器人打开我的 minecraft 服务器。 它基本上告诉所有这些很棒的程序打开我的服务器文件夹中的 start.bat。 这并没有像它应该的那样工作,所以我对 JS 东西的原始代码做了一些调整。它的名称是 console-bot.js

这是我尝试使用的原始文件:https://github.com/Stonley890/mc-console-bot

这是我调整后修改后的文件:

https://drive.google.com/drive/folders/15-42jB9GNoHCHSpW761KqJKpEoBp4wNv?usp=sharing

里面还有.bat文件。

原始文件根本不起作用,因为制作它的人只使用了一条斜线而不是两条斜线作为路径。我不知道为什么你需要两条斜杠,但嘿,我在某个地方读过它,它起作用了。

现在的问题是,当 .bat 文件打开时,它的行为有所不同。它要求我在 eula.txt 文件中输入“true”,这对于 minecraft 服务器来说很常见。问题是,文件在那里并且设置为 true,所以我认为它没有找到它。当我自己打开 .bat 时不会发生这种情况。 此外,当我将其设置为绕过 eula.txt 文件时,它也不起作用。

让我展示一下我卡在哪里:

`C:\Users\Administrador>node desktop\server dited-console-bot.js 机器人在线!哇哦! 正在尝试启动服务器。 启动 net.minecraft.server.Main

[11:36:44] [ServerMain/INFO]:构建未优化的 datafixer

[11:36:44] [ServerMain/INFO]:您需要同意 EULA 才能运行服务器。前往 eula.txt 获取更多信息。

子进程以代码 0 退出 C:\Users\Administrador\desktop\server dited-console-bot.js:66 message.guild.channels.resolve(serverstatus).setName('服务器: DOWN ❌'); ^

ReferenceError:未定义服务器状态 在 ChildProcess。 (C:\Users\Administrador\desktop\server dited-console-bot.js:66:48) 在 ChildProcess.emit(节点:事件:525:35) 在 maybeClose (node:internal/child_process:1091:16) 在套接字。 (节点:内部/子进程:449:11) 在 Socket.emit(节点:事件:513:28) 在管道。 (节点:网络:322:12)

Node.js v18.14.2`

我知道要问很多人,但是你能帮我解决这个问题吗?我真的很疲惫,因为我缺乏知识和保留新知识的能力可以达到什么程度。

我尝试更改路径以使用两个斜线,这对路径问题有效。 我尝试将 .bat 文件更改为所有可能的组合,这似乎不是代表文件的问题,而是程序及其尝试执行它的方式。 我尝试从 cmd 中分离 .bat 文件,以便它像我自己打开它一样工作,但这也不起作用。 我尝试让服务器完全在 .bat 文件上运行,而不是让它打开 java 服务器 thingie。没有雪茄。 我试着忘记它,把我的生活集中在更有成效和愉快的事情上。然后我意识到这是甚至更不切实际的目标。 我目前正在尝试寻求帮助。给你。你能帮我吗?好吗?

javascript node.js batch-file minecraft child-process
1个回答
0
投票

要使用 Node.js 和 child_process 模块让 Discord 机器人打开 .bat 文件,您可以使用 exec 或 spawn 方法。下面是一个使用 spawn 方法的例子:

const { spawn } = require('child_process');

client.on('message', message => {
 if (message.content === '!open') {
 const bat = spawn('cmd.exe', ['/c', 'path\\to\\file.bat']);

 bat.stdout.on('data', (data) => {
  console.log(data.toString());
 });

 bat.stderr.on('data', (data) => {
  console.error(data.toString());
 });

 bat.on('exit', (code) => {
  console.log(`Child process exited with code ${code}`);
});
}
});

本例中使用spawn方法执行.bat文件。第一个参数是要运行的命令(Windows 上为 cmd.exe),第二个参数是要传递给命令的参数数组。在这种情况下,我们传递 /c 来运行命令和 .bat 文件的路径。

stdout 和stderr 事件用于捕获命令的输出并将其记录到控制台。退出事件用于记录子进程的退出代码。

您可以将'!open'替换为您想要触发.bat文件打开的命令。并且,将“path o ile.bat”替换为您的 .bat 文件的实际路径。记得转义文件路径中的反斜杠。

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