Terabyte Image for Windows(以下简称 IFW)是 Terabyte Unlimited 出品的磁盘镜像备份软件,它的图形界面功能完整,但真正让它在运维场景里出彩的是自带的命令行工具 TBImage.exe。把 TBImage 接入自动化流程之后,整机备份可以从双击操作变成一个定时任务甚至一个网页按钮。本文就来聊聊如何用 Vue 3 写一个备份管理面板,把 TBImage 的能力包装成一套可用的工程化方案。

一、TBImage 命令行工具的核心参数
TBImage.exe 默认安装在 C:\Program Files\TeraByte Unlimited\Image for Windows 目录下,安装时如果勾选了命令行组件,也可以在安装目录直接找到。它的基本语法是 tbimage [操作] [参数],最常用的操作是创建镜像、恢复镜像和校验镜像三种。创建镜像的典型命令如下:
rem 备份第一块硬盘到 D 盘的镜像文件 "C:\Program Files\TeraByte Unlimited\Image for Windows\tbimage" /b /d1 /f"D:\Backups\SystemDisk.tbi" rem 恢复镜像到第一块硬盘 "C:\Program Files\TeraByte Unlimited\Image for Windows\tbimage" /r /d1 /f"D:\Backups\SystemDisk.tbi" rem 校验镜像完整性 "C:\Program Files\TeraByte Unlimited\Image for Windows\tbimage" /v /f"D:\Backups\SystemDisk.tbi"
参数 /b 表示备份(backup),/r 表示恢复(restore),/v 表示校验(validate)。/d1 指定目标磁盘编号,编号从 1 开始,可以通过 tbimage /l 列出当前机器上的所有磁盘信息。/f 指定镜像文件路径,支持 UNC 网络路径,比如 \\NAS\backup\server01.tbi,这对局域网集中备份非常友好。
除了基础参数,还有几个高频选项值得注意。--comp:1 到 --comp:4 控制压缩级别,级别越高镜像体积越小但耗时越长;--vb 使用基于扇区的完整备份方式,能捕获分区结构变化;--u1 或 --u2 指定镜像切分大小,比如 --u2 按 2GB 切分,方便后续刻录或传输。静默模式下建议加上 --w1 让程序出现提示时自动按默认值继续,避免批处理任务卡在交互确认上。
二、用 Node.js 封装 TBImage 的执行层
Vue 3 只能跑在浏览器里,没法直接启动本地进程,所以中间需要一个服务层。最简单的做法是用 Node.js 的 Express 起一个本地服务,通过 child_process.spawn 调用 TBImage.exe,并把标准输出实时推送给前端。下面是一个精简但可用的封装示例:
const { spawn } = require('child_process');
const express = require('express');
const app = express();
app.get('/api/backup', (req, res) => {
const args = ['/b', '/d1', '/fD:\\Backups\\SystemDisk.tbi', '--comp:2', '--w1'];
const proc = spawn('C:\\Program Files\\TeraByte Unlimited\\Image\\tbimage.exe', args);
let output = '';
proc.stdout.on('data', (data) => {
output += data.toString();
// 实际项目中这里应通过 WebSocket 推送给前端
});
proc.on('close', (code) => {
res.json({ code, output });
});
});
app.listen(3000, () => console.log('备份服务已启动'));这里有几个工程细节必须处理好。第一是权限问题:对系统盘做热备份需要管理员权限,Node 服务要以管理员身份运行,否则 TBImage 会因为无法获取磁盘句柄而失败。第二是路径转义,JavaScript 字符串里的 Windows 路径要写成 D:\\Backups\\SystemDisk.tbi 这种双反斜杠形式,或者使用正斜杠交给 TBImage 解析,但批处理脚本里必须保持 D:\Backups\ 的原始写法。第三是并发控制,同一块磁盘不能同时跑两个备份任务,建议在服务层维护一个任务队列,用简单的状态机标记磁盘为空闲或占用中。
日志推送方面,TBImage 的进度信息会持续输出到标准输出流,用轮询接口拉日志会有明显延迟,体验最好的方案是 WebSocket。服务层每收到一段输出就广播一次,前端订阅后把日志追加到页面上,还能用正则从输出中提取百分比数字,渲染出进度条。
三、Vue 3 前端面板的设计与实现
前端面板的核心页面有三个:磁盘列表页、任务执行页和历史记录页。磁盘列表通过调用服务层的 /api/disks 接口(内部执行 tbimage /l)获取,展示磁盘编号、容量和分区情况;任务执行页负责选择源磁盘、镜像存放路径、压缩级别,然后提交任务;历史记录页列出所有镜像文件并支持一键校验或恢复。组件层面用 Vue 3 的组合式 API 拆分逻辑,把任务状态管理抽成一个 composable:
import { ref, onMounted, onUnmounted } from 'vue';
export function useBackupTask() {
const logs = ref([]);
const progress = ref(0);
const running = ref(false);
let ws = null;
onMounted(() => {
ws = new WebSocket('ws://127.0.0.1:3000');
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === 'log') logs.value.push(msg.text);
if (msg.type === 'progress') progress.value = msg.percent;
});
});
onUnmounted(() => ws && ws.close());
const start = async (payload) => {
running.value = true;
await fetch('/api/backup', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
running.value = false;
};
return { logs, progress, running, start };
}这个 composable 把日志、进度、运行状态全部封装起来,页面组件只关心展示。进度条建议用 Element Plus 的 el-progress,日志区用一个自动滚动到底部的 pre 块。需要注意日志量可能很大,虚拟滚动不是必须的,但日志数组最好限制长度,比如只保留最近五百条,避免长时间任务把内存吃满。
四、备份目录规划与恢复环境准备
工程化方案里,备份文件的存放规则要提前定死。推荐按 D:\Backups\机器名\日期\磁盘编号.tbi 的层级组织,比如 D:\Backups\PC-4021\20250115\disk1.tbi。这样历史记录页可以直接扫描目录生成列表,清理过期备份也只需要删除对应日期文件夹。如果备份目标是 NAS,UNC 路径写成 \\NAS\backup\PC-4021\disk1.tbi,此时要确保服务层的运行账户对网络共享有写权限。
恢复环境是整个方案不能忽略的一环。系统盘损坏后 Windows 本身起不来,需要提前制作 IFW 的恢复介质(U 盘或光盘),恢复介质里的 TBImage 同样支持命令行。可以把常用恢复命令写成一个批处理放在恢复 U 盘里,例如 tbimage /r /d1 /f\\NAS\backup\PC-4021\disk1.tbi --w1,故障时插上 U 盘、敲一条命令就能把整台机器还原,这是镜像备份方案真正的价值所在。
最后提一句安全性:这个面板本质上是能擦写整块磁盘的高危入口,部署时务必只监听内网地址,加上登录鉴权,操作日志落库留痕。做完这些,一套基于 Vue 3 加 TBImage 的 TB 镜像自动化备份系统就具备了生产可用的基本形态。
Vue 3Terabyte Image for WindowsTB镜像备份修改时间:2026-09-14 00:30:56