本文目录导读:

- 虚拟机快照(以 VMware Workstation / ESXi 为例)
- 云服务器磁盘快照(以阿里云 CLI / AWS CLI 为例)
- 文件系统快照(ZFS / Btrfs)
- 批量截图/窗口快照(用于报告等)
- 通用型:一键多快照工具(推荐)
- 重要提醒(针对批量快照)
可以,批量快照是非常实用的功能,尤其在以下场景中很常用:
- 虚拟机环境:对多个 VM 或容器同时做快照(备份/回滚点)。
- 云服务器:对多个 ECS 实例创建磁盘快照。
- 文件系统:对多个目录或文件进行快照(如 ZFS/Btrfs 快照)。
- 设计工具:如对 Sketch/Figma 中的多个图层做快照(导出)。
这里按几种常见的技术对象,给你几个能直接用的实用脚本:
虚拟机快照(以 VMware Workstation / ESXi 为例)
场景:你需要同时对 3 个或更多 Linux/Windows 虚拟机打快照,不能一个一个手动点。
脚本思路:使用 vmrun(VMware 命令行工具)。
Windows 批处理脚本(batch) batch_snapshot.bat:
@echo off
set VMRUN_PATH="C:\Program Files (x86)\VMware\VMware VIX\vmrun.exe"
set SNAPSHOT_NAME="DailyBackup_%date:~0,4%%date:~5,2%%date:~8,2%"
REM 列出你的虚拟机 VMX 文件列表(可以用绝对路径或网络路径)
set VM_LIST=(
"D:\VMs\WebServer\WebServer.vmx"
"D:\VMs\DBServer\DBServer.vmx"
"D:\VMs\CacheServer\CacheServer.vmx"
)
for %%v in %VM_LIST% do (
echo Creating snapshot for %%v as %SNAPSHOT_NAME% ...
%VMRUN_PATH% snapshot %%v %SNAPSHOT_NAME%
)
pause
- 优点:一次性对多个 VM 做快照,自动带上日期。
- 增强版:也可以改成支持从文本文件读取 VM 列表。
云服务器磁盘快照(以阿里云 CLI / AWS CLI 为例)
场景:你有 N 台云服务器的系统盘/数据盘,需要在凌晨做批量快照。
Shell 脚本(Bash),使用阿里云 CLI aliyun:
#!/bin/bash
# 指定要打快照的磁盘 ID 列表(用空格分隔)
DISK_IDS="d-bp1hxxxxxxx01 d-bp1hxxxxxxx02 d-bp1hxxxxxxx03"
# 或者自动获取所有磁盘(需谨慎,建议加入过滤)
# DISK_IDS=$(aliyun ecs DescribeDisks --RegionId cn-hangzhou --PageSize 100 | jq -r '.Disks.Disk[].DiskId')
SNAPSHOT_TAG="BatchBackup_$(date +%Y%m%d%H%M)"
for disk_id in $DISK_IDS; do
echo "Creating snapshot for disk: $disk_id"
aliyun ecs CreateSnapshot \
--DiskId "$disk_id" \
--SnapshotName "${SNAPSHOT_TAG}_${disk_id}"
# 建议加短暂延迟,避免 API 限流
sleep 1
done
echo "All snapshots created."
- 安全提示:建议在测试环境先用
--dry-run测试。 - AWS 版:换成
aws ec2 create-snapshot --volume-id vol-xxx即可。
文件系统快照(ZFS / Btrfs)
场景:如果你用的是 ZFS(FreeBSD/Linux)或 Btrfs(openSUSE/Fedora),你可以瞬间大量快照。
ZFS 脚本(Bash) zfs_batch_snapshot.sh:
#!/bin/bash
# 要快照的数据集列表(空格分隔)
DATASETS="tank/data tank/home tank/backup"
SNAPSHOT_NAME="daily_$(date +%Y%m%d_%H%M%S)"
for ds in $DATASETS; do
echo "Creating snapshot: ${ds}@${SNAPSHOT_NAME}"
zfs snapshot "${ds}@${SNAPSHOT_NAME}"
done
# 可选:删除 7 天前的旧快照
for ds in $DATASETS; do
zfs list -H -o name -t snapshot | grep "${ds}" | grep -v "$(date +%Y%m%d)" | xargs -r zfs destroy
done
- 快感来源:ZFS 快照几乎是瞬间完成的(Copy-on-Write),搞几百个数据集的快照也就一两秒。
批量截图/窗口快照(用于报告等)
场景:你有一堆窗口程序或网页,需要给它们批量截图。
PowerShell 脚本(Windows):
# 假设你想截图所有打开的记事本
$notepadWindows = Get-Process notepad | Where-Object { $_.MainWindowHandle -ne 0 }
$notepadWindows | ForEach-Object {
$filename = "Snapshot_$($_.Id)_$([System.DateTime]::Now.ToString('yyyyMMdd_HHmmss')).png"
# 需要 Add-Type 调用 user32.dll 等 API,这里简化展示思路
Write-Host "Taking snapshot of window ID: $($_.Id) -> $filename"
# 实际截图需调用 .NET 的 Graphics.CopyFromScreen 或第三方库
}
- 完整实现需要一些 API 调用,但在有 Python 的环境下,用
pygetwindow+PIL更简单,核心代码只需几行。
通用型:一键多快照工具(推荐)
如果你经常需要做这类操作,可以使用 Python 脚本把逻辑集中起来,支持 CSV 配置文件:
# batch_snapshot.py (简易框架)
import subprocess
import csv
import datetime
def create_vm_snapshot(vm_path, snap_name):
subprocess.run(["vmrun", "snapshot", vm_path, snap_name])
def create_disk_snapshot(disk_id, region):
subprocess.run(["aliyun", "ecs", "CreateSnapshot", "--DiskId", disk_id, "--RegionId", region])
# 从 CSV 读取任务
with open('snapshot_tasks.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
task_type = row['type']
target = row['target']
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
snap_name = f"AutoSnap_{timestamp}"
if task_type == 'vmware':
create_vm_snapshot(target, snap_name)
elif task_type == 'aliyun':
create_disk_snapshot(target, row['region'])
# ...扩展更多类型
print(f"✅ Snapshot created for {target}")
CSV 文件示例 snapshot_tasks.csv:
type,target,region vmware,/path/to/machine.vmx, aliyun,d-bp1xxxxx01,cn-hangzhou aliyun,d-bp1xxxxx02,cn-beijing
重要提醒(针对批量快照)
- 检查依赖:确保命令行工具已安装并配置好(
vmrun、aliyun、aws、zfs)。 - API 频率限制:云服务商通常对批量创建快照有速率限制(如 QPS=10),脚本中加入
sleep 1是良好的习惯。 - 快照是有成本的:无论是存储空间还是费用,批量快照如果长期保留,需要及时清理过期快照。
- 应用一致性:对数据库虚拟机的快照,建议使用静默快照或提前触发锁表/冻结 I/O,否则恢复后数据库可能需要修复。
你需要针对哪种场景(虚拟机/云磁盘/文件系统/截图)的脚本?我可以给你写一个可以直接运行的具体版本。