在 Hyper-V 中直接复制虚拟机配置或磁盘,容易导致名称冲突、ID 冲突,甚至误修改原虚拟机。本文提供一种官方推荐的安全方法:通过 Export → Import(Copy + GenerateNewId) 实现完整克隆,并自动重命名新虚拟机。
这是1对1的克隆,如果在克隆,输入新的newwm名称,在执行如下代码操作即可。
📋 使用前准备
- 以 管理员身份运行 PowerShell
- 确保源虚拟机已关闭(建议)
- 修改脚本中的变量:
$oldVM = "原虚拟机名称"
$newVM = "新虚拟机名称"
$base = "克隆存储目录"新增虚拟机,一键代码如下:【回车 输出结果】
$oldVM = "WIN11H24"
$newVM = "WIN11H28"
$base = "D:\Hyper-V\ClonedVM"
# 导出
$stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$exportRoot = Join-Path $base ("_export_" + $stamp)
Export-VM -Name $oldVM -Path $exportRoot
# 找 vmcx
$vmcx = Get-ChildItem $exportRoot -Recurse -Filter *.vmcx | Select -First 1
# 新 VM 目录
$newRoot = Join-Path $base $newVM
$vmPath = Join-Path $newRoot "VM"
$vhdPath = Join-Path $newRoot "VHD"
$snapPath = Join-Path $newRoot "Snapshots"
New-Item -ItemType Directory -Force -Path $vmPath,$vhdPath,$snapPath | Out-Null
# 导入(此时会生成一个名为 WIN11H26 的克隆)
Import-VM -Path $vmcx.FullName -Copy -GenerateNewId `
-VirtualMachinePath $vmPath `
-VhdDestinationPath $vhdPath `
-SnapshotFilePath $snapPath | Out-Null
# ⭐ 只从目标路径找新 VM(绝不会找到原机)
$newImported = Get-VM | Where-Object { $_.Path -like ($vmPath + "*") }
# ⭐ 按对象改名(安全)
Rename-VM -VM $newImported -NewName $newVM
# 清理导出
Remove-Item -Recurse -Force $exportRoot
"OK:原机未改变,新机=$newVM"📋 使用前准备
- 以 管理员身份运行 PowerShell
- 确保源虚拟机已关闭(建议)
- 修改脚本中的变量:
$vmName = "虚拟机名称"删除虚拟机,一键代码如下:【回车 输出结果】
# 指定要删除的虚拟机名称
$vmName = "WIN11H28"
# 定义虚拟机文件夹路径
$vmFolderPath = "D:\Hyper-V\ClonedVM\$vmName"
# 检查虚拟机文件夹是否存在
if (Test-Path -Path $vmFolderPath) {
# 获取虚拟机对象
$vm = Get-VM -Name $vmName
# 如果虚拟机存在
if ($vm) {
# 如果虚拟机正在运行,强制停止虚拟机
if ($vm.State -eq 'Running') {
Stop-VM -VM $vmName -Force
}
# 从 Hyper-V 中删除虚拟机(仅注销虚拟机,不删除文件)
Remove-VM -Name $vmName -Force
# 删除虚拟机文件夹及其所有内容
Remove-Item -Path $vmFolderPath -Recurse -Force
# 输出成功消息
"虚拟机 $vmName 和相关文件夹已成功删除。"
} else {
# 如果虚拟机不存在,输出提示信息
"未找到虚拟机 $vmName。"
}
} else {
# 如果虚拟机文件夹不存在,输出提示信息
"未找到文件夹路径 $vmFolderPath。"
}原创文章,作者:开心电脑网,如若转载,请注明出处。