很多 VMware 用户管理多台虚拟机时,手动逐台开关效率极低,还容易出现漏开漏关的问题,想批量操作又怕操作失误影响业务。本文整理了两种官方合规的批量开关方案:有 vCenter 或需图形化联动的环境,用 PowerCLI 一行命令一键批量操作;单节点 ESXi 无第三方工具的环境,用原生 vim-cmd 写简单 shell 脚本循环执行。两种方法步骤清晰,新手也能照着操作,高效完成多台虚拟机的批量管理。
一、前置通用准备(两种方案都要做,避坑前提)
- 业务风险规避:批量操作前,确认所有待操作虚拟机的业务状态,非维护窗口禁止批量关闭生产业务虚拟机;建议对重要虚拟机提前做快照或备份,避免操作失误。
- 权限准备:两种方案都需要使用 ESXi/vCenter 的管理员账号(root 或 vCenter 管理员),确保账号有虚拟机的开机、关机、查询权限。
- 环境预检:提前记录待操作虚拟机的名称、ID,可通过 ESXi/vCenter 网页管理界面先确认虚拟机当前状态(开机 / 关机),避免重复操作。
二、方案一:PowerCLI 一键批量操作(有 vCenter/ESXi 图形化环境首选)
PowerCLI 是 VMware 官方推出的 PowerShell 管理模块,无需复杂脚本,一行命令就能完成批量操作,适合有 vCenter 的集群环境,或单节点 ESXi 的 Windows 管理端。
步骤 1:安装 VMware PowerCLI
-
在 Windows 管理端打开 PowerShell(以管理员身份运行),执行以下命令安装官方模块:
Install-Module -Name VMware.PowerCLI -Scope CurrentUser -Force -
安装完成后,执行以下命令跳过证书验证(避免自签名证书导致连接失败):
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false
步骤 2:连接 ESXi/vCenter 服务器
执行以下命令连接目标服务器,替换 IP 地址、账号和密码:
Connect-VIServer -Server 192.168.1.100 -User root -Password 你的密码
连接成功后会显示服务器信息,确认无误后进入批量操作。
步骤 3:核心批量操作命令
-
批量开机(所有关机状态的虚拟机):本文核心命令,一键启动所有已关机的虚拟机:
Get-VM | Where-Object {$_.PowerState -eq "PoweredOff"} | Start-VM若无需筛选,直接启动所有虚拟机(包括已开机的,不影响已运行状态):
Get-VM | Start-VM -
批量关机(所有开机状态的虚拟机):安全关闭虚拟机(触发系统正常关机,非强制断电),跳过确认提示:
Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | Stop-VM -Confirm:$false若需强制断电关机(仅用于测试环境或无业务的虚拟机):
Get-VM | Where-Object {$_.PowerState -eq "PoweredOn"} | Stop-VM -Kill -Confirm:$false -
**进阶:按条件筛选批量操作(更实用)**可按虚拟机名称、文件夹、资源池筛选,避免误操作:
-
按名称关键词筛选(比如批量启动名称含 "测试" 的虚拟机): powershell
Get-VM -Name "*测试*" | Where-Object {$_.PowerState -eq "PoweredOff"} | Start-VM -
按文件夹筛选(vCenter 环境,批量启动 "开发环境" 文件夹下的虚拟机): powershell
Get-VM -Location "开发环境" | Where-Object {$_.PowerState -eq "PoweredOff"} | Start-VM
-
步骤 4:操作完成后断开连接
批量操作结束后,执行以下命令断开与服务器的连接:
Disconnect-VIServer -Server 192.168.1.100 -Confirm:$false
三、方案二:vim-cmd 脚本循环操作(单节点 ESXi 无第三方工具首选)
vim-cmd 是 ESXi 系统原生自带的命令行管理工具,无需安装 PowerCLI,无需 Windows 管理端,直接在 ESXi 的 SSH 界面写简单 shell 脚本就能批量操作,适合无 vCenter 的单节点 ESXi 主机。
步骤 1:开启 ESXi 的 SSH 服务
- 登录 ESXi 网页管理界面,进入【主机】-【操作】-【服务】-【启用安全 Shell (SSH)】
- 用 SSH 工具(Xshell、Putty、Windows 自带终端)登录 ESXi 主机,使用 root 账号和密码。
步骤 2:获取所有虚拟机的 ID 和名称
执行以下命令,查看当前 ESXi 主机上所有虚拟机的列表,记录待操作虚拟机的 VMID(数字 ID)或名称:
vim-cmd vmsvc/getallvms
输出结果中,第一列是 VMID(比如 1、2、3),第二列是虚拟机名称,后续操作可通过 VMID 或名称执行。
步骤 3:编写批量操作的 shell 脚本
在 ESXi 的 /tmp 目录下创建脚本文件(比如批量开机脚本batch_start.sh),用 vi 编辑器编辑:
vi /tmp/batch_start.sh
按i键进入编辑模式,粘贴以下脚本内容(两种方式二选一):
方式 1:按 VMID 列表批量操作(更精准,推荐)
替换脚本中的 VMID 列表(比如 1、2、3、5),仅操作指定 ID 的虚拟机:
#!/bin/sh
# 批量开机脚本:替换下方VMID列表为你需要操作的虚拟机ID
VMID_LIST="1 2 3 5"
for VMID in $VMID_LIST; do
echo "正在启动虚拟机ID: $VMID"
vim-cmd vmsvc/power.on $VMID
# 若需批量关机,将上方命令替换为:vim-cmd vmsvc/power.off $VMID(安全关机)
# 或:vim-cmd vmsvc/power.shutdown $VMID(触发系统正常关机)
done
echo "批量操作完成!"
方式 2:循环所有虚拟机批量操作(适合全量操作)
无需手动列 ID,自动遍历所有虚拟机,可添加名称过滤(比如排除名称含 "生产" 的虚拟机):
#!/bin/sh
# 批量开机脚本:自动遍历所有虚拟机,可添加名称过滤
vim-cmd vmsvc/getallvms | awk 'NR>1 {print $1, $2}' | while read VMID VMNAME; do
# 可选:添加名称过滤,排除名称含"生产"的虚拟机,删除本行则不过滤
if echo "$VMNAME" | grep -q "生产"; then
echo "跳过虚拟机: $VMNAME(名称含生产)"
continue
fi
# 检查虚拟机当前状态,仅操作关机状态的
POWER_STATE=$(vim-cmd vmsvc/power.getstate $VMID | grep -i "off")
if [ -n "$POWER_STATE" ]; then
echo "正在启动虚拟机: $VMNAME (ID: $VMID)"
vim-cmd vmsvc/power.on $VMID
else
echo "虚拟机 $VMNAME 已开机,跳过"
fi
done
echo "批量操作完成!"
编辑完成后,按Esc键,输入:wq保存并退出编辑器。
步骤 4:执行脚本完成批量操作
-
给脚本添加执行权限:
chmod +x /tmp/batch_start.sh -
执行脚本:
/tmp/batch_start.sh -
观察输出结果,确认所有虚拟机按预期执行操作,操作完成后可通过以下命令再次检查虚拟机状态:
vim-cmd vmsvc/getallvms
四、新手必看:高频踩坑避坑指南
- 批量关闭生产虚拟机:绝对禁止在非维护窗口批量关闭生产业务虚拟机,操作前务必确认虚拟机用途和业务状态。
- PowerCLI 未跳过证书验证 :ESXi 默认自签名证书,不跳过验证会导致连接失败,务必先执行
Set-PowerCLIConfiguration命令。 - vim-cmd 强制断电 :生产环境优先用
vim-cmd vmsvc/power.shutdown触发系统正常关机,避免用power.off强制断电导致数据丢失。 - 脚本未测试直接执行 :建议先在脚本中添加
echo测试命令,确认筛选的虚拟机无误后,再替换为实际的开关命令。 - 忽略权限问题:必须用 root 或管理员账号执行操作,普通账号无虚拟机开关权限,会导致命令执行失败。
总结
ESXi/vCenter 批量开关虚拟机的两种方案各有优势:有 vCenter 或 Windows 管理端的环境,优先用 PowerCLI,一行命令就能完成,还能灵活筛选;单节点 ESXi 无第三方工具的环境,用原生 vim-cmd 写简单 shell 脚本,无需额外安装软件,直接在 SSH 界面操作。只要做好前置业务确认和备份,严格按步骤执行,就能高效安全地完成多台虚拟机的批量管理。