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

如何在Node.js中获取控制台标签页标题?

获取并恢复控制台标签页标题(针对Windows Terminal + Git Bash)

核心思路与实现方案

针对你使用的Windows Terminal + Git Bash环境,有两种可靠的方案可以实现「获取原标题→设置新标题→退出恢复」的需求,无需依赖额外工具或复杂操作:


方案1:通过Windows原生命令获取标题(最稳定)

Git Bash可以直接调用Windows的cmd.exe,利用title命令输出当前窗口标题,再通过Node.js的child_process模块捕获输出:

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

// 获取当前标签页标题
function getCurrentTitle() {
  try {
    // 调用cmd.exe执行title命令,捕获输出
    const title = execSync('cmd.exe /c title', { 
      encoding: 'utf8', 
      stdio: ['ignore', 'pipe', 'ignore'] // 忽略输入和错误输出
    });
    return title.trim(); // 去除末尾换行符
  } catch (err) {
    // 失败时返回默认标题
    return 'Git Bash';
  }
}

// 保存原标题
const originalTitle = getCurrentTitle();

// 设置新标题
process.stdout.write('\x1b]0;My App Title\x07');

// 处理所有退出场景,恢复原标题
function restoreTitle() {
  process.stdout.write(`\x1b]0;${originalTitle}\x07`);
}
process.on('exit', restoreTitle);
process.on('SIGINT', () => { // 捕获Ctrl+C
  restoreTitle();
  process.exit(0);
});
process.on('SIGTERM', () => { // 捕获终止信号
  restoreTitle();
  process.exit(0);
});

方案2:通过终端控制序列查询标题(纯终端原生方式)

Windows Terminal支持ANSI控制序列中的「查询窗口标题」指令,发送\x1b]0;?\x07后,终端会将当前标题通过stdout返回,我们可以监听输出提取标题:

const { once } = require('events');

// 异步获取当前标题
async function getCurrentTitle() {
  return new Promise((resolve) => {
    // 保存原stdout的监听函数,避免干扰其他输出
    const originalListeners = process.stdout.listeners('data');
    process.stdout.removeAllListeners('data');

    // 监听终端返回的标题响应
    const onData = (data) => {
      const titleMatch = data.toString().match(/\x1b]0;(.*)\x07/);
      if (titleMatch) {
        // 恢复原监听函数
        process.stdout.removeListener('data', onData);
        originalListeners.forEach(listener => process.stdout.on('data', listener));
        resolve(titleMatch[1]);
      }
    };
    process.stdout.on('data', onData);

    // 发送查询标题的控制序列
    process.stdout.write('\x1b]0;?\x07');

    // 设置超时,防止终端无响应时一直等待
    setTimeout(() => {
      process.stdout.removeListener('data', onData);
      originalListeners.forEach(listener => process.stdout.on('data', listener));
      resolve('Git Bash');
    }, 100);
  });
}

// 使用示例
(async () => {
  const originalTitle = await getCurrentTitle();
  console.log('原标签页标题:', originalTitle);

  // 设置新标题
  process.stdout.write('\x1b]0;My App Title\x07');

  // 退出时恢复标题
  const restoreTitle = () => process.stdout.write(`\x1b]0;${originalTitle}\x07`);
  process.on('exit', restoreTitle);
  process.on('SIGINT', () => { restoreTitle(); process.exit(0); });
})();

补充说明

  • 方案1兼容性更强,只要Git Bash能调用Windows的cmd.exe就可以运行,无需考虑终端对控制序列的支持;
  • 方案2是纯终端原生方式,理论上支持所有兼容ANSI OSC 0序列的终端(如Windows Terminal、iTerm2等),但需要处理异步响应的监听逻辑;
  • 务必处理SIGINT(Ctrl+C)和SIGTERM信号,避免程序被中断时无法恢复原标题。

内容的提问来源于stack exchange,提问作者dx_over_dt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:25:24