在Hyper-V 上克隆 Windows 11 虚拟机实现以下功能:
- 获取虚拟机和宿主操作系统的配置信息。
- 提示用户输入要克隆的虚拟机数量。
- 根据宿主操作系统的物理内存大小建议分配内存。
- 克隆指定数量的虚拟机,并设置内存和处理器数量,然后启动虚拟机。
CloneWin11VM_new.ps1脚本代码如下:
# 定义虚拟机名称
$VMName = "Win11VM"
# 获取虚拟机配置信息
$VMInfo = Get-VM -Name $VMName | Select-Object Name, ProcessorCount, @{Name="MemoryStartupGB"; Expression={[math]::Round($_.MemoryAssigned / 1GB, 2)}}, State, Version
# 获取宿主操作系统信息,包括物理内存(以GB为单位)
$HostOSInfo = Get-WmiObject -Class Win32_OperatingSystem | Select-Object CSName, Caption, Version, @{Name="TotalPhysicalMemoryGB"; Expression={[math]::Round($_.TotalVisibleMemorySize / 1024 / 1024, 0)}}, @{Name="InstallDate"; Expression={[Management.ManagementDateTimeConverter]::ToDateTime($_.InstallDate)}}
# 显示虚拟机配置信息
Write-Host "虚拟机配置信息:"
$VMInfo | Format-Table
# 显示宿主操作系统信息,包括物理内存(以GB为单位)
Write-Host "宿主操作系统信息:"
$HostOSInfo | Format-Table
# 用户输入克隆虚拟机数量
$NumberOfClones = Read-Host "请输入要克隆的虚拟机数量"
# 定义变量
$SourceVMName = "Win11VM" # 源虚拟机的名称
$SwitchName = "Default Switch"
# 停止源虚拟机,如果虚拟机处于运行状态
if ((Get-VM -Name $SourceVMName).State -eq "Running") {
Stop-VM -Name $SourceVMName -Force
}
# 克隆虚拟机
$VMTemplatePath = "D:\Hyper-V\Win11VM\Win11VM.vhdx" # 虚拟机模板的路径
$NewVMs = @()
# 生成新虚拟机名称列表
for ($i = 1; $i -le $NumberOfClones; $i++) {
$NewVMs += "Win11vm" + "{0:D3}" -f $i
}
foreach ($NewVMName in $NewVMs) {
$NewVHDPath = "D:\Hyper-V\$NewVMName\$NewVMName.vhdx" # 新虚拟机的VHD路径
# 检查虚拟机文件是否存在
$VHDExists = Test-Path $NewVHDPath
# 检查虚拟机是否存在
$VMExists = Get-VM -Name $NewVMName -ErrorAction SilentlyContinue
# 如果虚拟机文件和虚拟机名称都存在,则直接启动虚拟机
if ($VHDExists -and $VMExists) {
Start-VM -Name $NewVMName
}
else {
# 创建目标文件夹
$TargetFolder = Split-Path -Path $NewVHDPath
if (!(Test-Path $TargetFolder)) {
New-Item -Path $TargetFolder -ItemType Directory
}
# 克隆虚拟硬盘文件
Copy-Item -Path $VMTemplatePath -Destination $NewVHDPath -Force
# 根据宿主操作系统的物理内存,建议分配内存
if ($HostOSInfo.TotalPhysicalMemoryGB -lt 8) {
$Memory = 4GB
}
else {
$Memory = 8GB
}
# 创建新的虚拟机
New-VM -Name $NewVMName -MemoryStartupBytes $Memory -VHDPath $NewVHDPath -SwitchName $SwitchName -Generation 2
Set-VM -Name $NewVMName -ProcessorCount 2
# 启动虚拟机
Start-VM -Name $NewVMName
}
}