vmctl 是一个基于 Go 的 Windows 命令行工具,用于统一管理本地 VMware Workstation 虚拟机。它将常见的 vmrun.exe 虚拟机与来宾系统操作封装为一套 CLI,同时也支持以 MCP Server 模式对外提供能力。
- 列出受管虚拟机并查看基础运行状态
- 批量开机、关机、重启虚拟机
- 创建、列出、删除、回滚快照
- 在宿主机与来宾系统之间上传、下载文件
- 在来宾系统中执行脚本、内联命令和本地 EXE
- 列出、查找、结束来宾系统进程
- 读取和修改 Windows 来宾系统注册表
- 以 MCP Server 模式接入 AI Agent
- Windows 宿主机
- 本地构建需要 Go
1.21+ - 已安装 VMware Workstation / VMware VIX,并可使用
vmrun.exe - 具备足够权限的来宾系统账号
- 复制示例配置文件:
Copy-Item .\config.yaml.example .\config.yaml- 如果配置中使用了
${env:...}占位符,请先设置环境变量:
$env:VM_PASSWORD = "your-password"-
修改
config.yaml,填入本机 VMware 路径和虚拟机清单。 -
执行一个基础命令:
go run . listconfig.yaml.example 展示了支持的配置结构,主要字段如下:
vmware.vmrun_path:vmrun.exe的绝对路径vmware.network_type:支持host-local、nat、bridged、custom、nonedefaults:全局超时、并发数、来宾临时目录、默认快照策略credentials:默认来宾账号信息vms:虚拟机列表,可为单台虚拟机单独覆盖凭据、快照、描述和标签
凭据字段支持 ${env:VAR_NAME} 语法,例如:
credentials:
username: "Administrator"
password: "${env:VM_PASSWORD}"# 列出所有配置的虚拟机
vmctl list
# 启动单台虚拟机
vmctl power on --vm web-server
# 重启除某一台之外的所有虚拟机
vmctl reboot --all --exclude test-client
# 将带有指定标签的虚拟机回滚到快照并自动启动
vmctl snapshot revert --tag production --snapshot baseline --start
# 在来宾系统中执行一条 PowerShell 命令
vmctl exec --vm test-client --inline "hostname" --shell powershell
# 上传文件到来宾系统
vmctl upload --vm test-client --local .\agent.exe --remote C:\Temp\agent.exe
# 从来宾系统下载文件
vmctl download --vm test-client --remote C:\Temp\result.txt --local .\result.txt
# 启动 MCP Server 模式
vmctl mcp --config .\config.yaml虚拟机选择参数互斥,只能使用其中一种:
--vm name1,name2--all--tag tag1,tag2
--exclude 可以和 --all 或 --tag 一起使用。
本地构建:
go build -buildvcs=false -o vmctl.exe .运行测试:
go test ./...仓库中包含两套 GitHub Workflow:
.github/workflows/ci.yml:在push和pull_request时执行gofmt检查、go vet、go test,并构建vmctl.exe作为 artifact 上传.github/workflows/release.yml:在推送符合v*规则的标签时自动构建 Windows 发布包、生成 SHA256 校验文件,并创建 GitHub Release
发布示例:
git tag v0.1.0
git push origin v0.1.0下面是一个 Claude Desktop 配置示例:
{
"mcpServers": {
"vmctl": {
"command": "vmctl.exe",
"args": ["mcp"],
"env": {
"VM_PASSWORD": "your-password"
}
}
}
}