Discord.js命令执行PowerShell脚本失败求助
解决spawn调用PowerShell脚本无响应的问题
核心问题分析
你直接将脚本路径作为powershell.exe的参数传递是错误的,PowerShell需要通过-File参数明确指定要执行的脚本文件;同时spawn是异步操作,你没有捕获执行过程中的错误与输出,无法排查脚本未执行的具体原因。
修复步骤
修正PowerShell调用参数
执行脚本必须添加-File参数,正确的调用写法如下:spawn('powershell.exe', ['-File', 'D:/Dev/My Bot/test.ps1']);路径包含空格时,通过数组传递参数的方式会由Node.js自动处理转义,无需额外手动加引号。
添加日志与错误捕获
为了确认脚本执行状态、排查潜在问题,需要监听子进程的输出与错误流:const child = spawn('powershell.exe', ['-File', 'D:/Dev/My Bot/test.ps1']); // 捕获脚本正常输出 child.stdout.on('data', (data) => { console.log(`PowerShell输出: ${data}`); }); // 捕获脚本执行错误 child.stderr.on('data', (data) => { console.error(`PowerShell错误: ${data}`); }); // 捕获进程退出状态 child.on('close', (code) => { console.log(`PowerShell进程退出码: ${code}`); });这样就能看到脚本执行的具体细节,比如权限不足、脚本语法错误等问题都会被打印出来。
异步逻辑优化(可选)
如果需要等待脚本执行完成后再回复用户,可以将spawn包装为Promise:function runPowerShellScript(scriptPath) { return new Promise((resolve, reject) => { const child = spawn('powershell.exe', ['-File', scriptPath]); let stdout = ''; let stderr = ''; child.stdout.on('data', (data) => stdout += data); child.stderr.on('data', (data) => stderr += data); child.on('close', (code) => { code === 0 ? resolve(stdout) : reject(new Error(`脚本执行失败,退出码${code}: ${stderr}`)); }); }); }然后在命令处理逻辑中调用:
async execute(interaction) { if (authorizedUsers.includes(interaction.user.id)) { console.log('Starting minecraft server'); try { await runPowerShellScript('D:/Dev/My Bot/test.ps1'); console.log('Minecraft server started !'); await interaction.reply('Minecraft server started !'); } catch (err) { console.error('启动失败:', err); await interaction.reply(`启动失败: ${err.message}`); } } else { await interaction.reply('You can\'t use this command'); } }
额外注意事项
- 确保运行机器人的Node.js进程有执行该PowerShell脚本的权限,比如Windows下是否以管理员身份启动进程、脚本文件是否开放读取执行权限。
- 始终使用绝对路径指定脚本位置,避免相对路径带来的路径解析问题。
内容的提问来源于stack exchange,提问作者draymone
相关产品推荐
相关产品推荐

