You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js命令执行PowerShell脚本失败求助

解决spawn调用PowerShell脚本无响应的问题

核心问题分析

你直接将脚本路径作为powershell.exe的参数传递是错误的,PowerShell需要通过-File参数明确指定要执行的脚本文件;同时spawn是异步操作,你没有捕获执行过程中的错误与输出,无法排查脚本未执行的具体原因。

修复步骤

  1. 修正PowerShell调用参数
    执行脚本必须添加-File参数,正确的调用写法如下:

    spawn('powershell.exe', ['-File', 'D:/Dev/My Bot/test.ps1']);
    

    路径包含空格时,通过数组传递参数的方式会由Node.js自动处理转义,无需额外手动加引号。

  2. 添加日志与错误捕获
    为了确认脚本执行状态、排查潜在问题,需要监听子进程的输出与错误流:

    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}`);
    });
    

    这样就能看到脚本执行的具体细节,比如权限不足、脚本语法错误等问题都会被打印出来。

  3. 异步逻辑优化(可选)
    如果需要等待脚本执行完成后再回复用户,可以将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:08:29