如何在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
相关产品推荐
相关产品推荐

