千家信息网

PowerShell批量部署Hyper-V Windows虚机

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,第一步:制作模板VHDX文件(略);第二步:制作初始化系统脚本(自动设置IP、GW等);将以下2个脚本放置到模板VHDX中的C:\Windows\Setup\Scripts目录下:第1个脚本:Firs
千家信息网最后更新 2026年11月03日PowerShell批量部署Hyper-V Windows虚机
第一步:制作模板VHDX文件(略);第二步:制作初始化系统脚本(自动设置IP、GW等);将以下2个脚本放置到模板VHDX中的C:\Windows\Setup\Scripts目录下:第1个脚本:FirstRun.ps1#获取计算机名称$VMname=hostname#根据计算机名称获取IP地址后6位[int]$IP1=$VMname.Substring($VMname.Length - 6,3)[int]$IP2=$VMname.Substring($VMname.Length - 3,3)#设定FSNNetwork$IPaddr1=$IPaddr1='172.1.' + $IP1 + '.' + $IP2New-NetIPAddress -InterfaceIndex 12 -IPAddress $IPaddr1 -PrefixLength 16 -DefaultGateway 172.1.0.250Set-DnsClientServerAddress -InterfaceIndex 12 -ServerAddresses ("172.1.0.1","172.1.0.2")exit第2个脚本:SetupComplete.cmd (该脚本名称必须为SetupComplete)Powershell -Command "C:\Windows\Setup\Scripts\'FirstRun.ps1'"timeout 3gpupdate /forcecd  C:\Windows\System32wuauclt.exe /DetectNow /UpdateNow::cd  C:\FalconAgent::falcon-agent.exe -service install::sc.exe config  falconagent Start=delayed-auto::falcon-agent.exe -service startdel C:\Windows\Setup\Scripts\FirstRun.ps1del %0第三步:创建自动化部署脚本# ================================ ##    Create-VM_V1.0(Windows).PS1   #   #   通过PowerShell创建Hyper-V虚机  #  # ================================ ##Param($VM_Name,$VM_HostName)Write-Host -NoNewline -ForegroundColor Magenta '请输入要创建的虚机名称(如:VWSR******)'[String]$VM_Name = Read-HostWrite-Host -NoNewline -ForegroundColor Magenta '请输入需要放在哪台宿主机上(如:PWSR******)'[String]$VM_HostName= Read-HostWrite-Host -NoNewline -ForegroundColor Magenta '要部署App Server还是SQL Server?默认App Server回车即可(如:sql 回车或者2 回车)'[String]$VM_OSClass= Read-Host#判断虚机名称是否为大写字母if ($VM_Name |findstr 'vwsr')   { Write-Host -NoNewline -ForegroundColor Yellow '注意:虚机名需要使用大写字母!!!'     break } Else   { }   $VM_Memory= 4GB$VM_CpuCount= 4$Owner= "IT"$Org= "sxleilong.com"$NetworkSwitch= "FSNNetwork"#$AdminPassword = "Administrator Password"$SourcePath= "D:\VM_Deploy_Script"$DjoinSource= $SourcePath + '\' + $VM_Name +'.txt'#if判断要部署App Server还是SQL Server,默认是App Serverif (($VM_OSClass -eq '2') -or ($VM_OSClass -eq 'sql') -or ($VM_OSClass -eq 'SQL'))   {$Template_VHDX= $SourcePath + '\' + 'En_WinSrv12R2_For_SQL.vhdx'    Write-Host -ForegroundColor Green "您选择安装SQL虚机!!!"    }Else   {$Template_VHDX= $SourcePath + '\' + 'En_WinSrv12R2_For_APP.vhdx'    Write-Host -ForegroundColor Green "您选择安装App虚机!!!"    }#if判断如果虚机所在宿主机为管理系,虚机文件存放位置为E盘  if (( $VM_HostName -eq 'PWSR252001' ) -or ($VM_HostName -eq 'PWSR252002' ))   { $VM_Path = 'E:\' + $VM_HostName + '_E_VMs'     $VM_RemotePath = '\\' + $VM_HostName + '\E$\' + $VM_HostName + '_E_VMs' }Else   { $VM_Path = 'D:\' + $VM_HostName + '_D_VMs'     $VM_RemotePath = '\\' + $VM_HostName + '\D$\' + $VM_HostName + '_D_VMs' }   $VM_VHDPath = $VM_Path + '\' + $VM_Name + '\Virtual Hard Disks\'+ $VM_Name + '.vhdx'$VM_VHDRemotePath = $VM_RemotePath + '\' + $VM_Name + '\Virtual Hard Disks\' + $VM_Name + '.vhdx'#if判断是否为0系管理服务器,用以自动加入不同OUif ($VM_Name |findstr 'VWSR000'  )   { $VM_MachineOU= "OU=MgmtServers,OU=sxleilong,DC=sxleilong,DC=cn" }Else   { $VM_MachineOU= "OU=NewInfra,OU=Production Servers,OU=sxleilong,DC=sxleilong,DC=cn" }#编辑应答文件模板$UnattendTemplate= "Unattend-template.xml"$Unattendfile= New-Object XML$Unattendfile.Load($SourcePath+"\"+$UnattendTemplate)$Unattendfile.unattend.settings.component[2].ComputerName=$VM_Name$Unattendfile.unattend.settings.component[2].RegisteredOrganization=$Org$Unattendfile.unattend.settings.component[2].RegisteredOwner=$Owner$Unattendfile.unattend.settings.Component[3].RegisteredOrganization=$Org$Unattendfile.unattend.settings.Component[3].RegisteredOwner=$Owner#$UnattendFile.unattend.settings.component[3].UserAccounts.AdministratorPassword.Value=$AdminPassword#$UnattendFile.unattend.settings.component[3].autologon.password.value=$AdminPassword$UnattendXML=$SourcePath+"\"+$VM_Name+".xml"$Unattendfile.save($UnattendXML)#Mount模板VHDXMount-diskp_w_picpath $Template_VHDX$DriveLetter=((Get-DiskImage $Template_VHDX | get-disk | get-partition | Where-Object Type -eq "Basic").DriveLetter)+":"#注入Unattend.xml文件到VHDX中$UnattendXml_Destination=$Driveletter+"\Windows\System32\Sysprep\unattend.xml"Copy-Item $UnattendXml $UnattendXml_Destination -Force#生成Offline JoinDomain文件Djoin /Provision /Domain sxleilong.com /Machine $VM_Name /MachineOU $VM_MachineOU /Savefile $DjoinSource /Reuse#注入Offline JoinDomain文件,并移除历史DjoinFile$DjoinDestination= $Driveletter+'\Windows'$His_DjoinFile= $DjoinDestination +'\'+'VWSR*.txt'Remove-Item -Path $His_DjoinFile -ForceCopy-Item $DjoinSource  $DjoinDestination -ForceDjoin /RequestODJ /Loadfile  "$VM_Name.txt" /WindowsPath $DjoinDestination /LocalOS#注入开机运行脚本$ScriptFolder=$DriveLetter+"\Windows\Setup\Scripts\"$Scriptname=$Scriptfolder+"FirstRun.ps1"If (Test-Path $ScriptFolder)   {}Else   {    New-Item $ScriptFolder -ItemType Directory    Copy-Item "$SourcePath\Scripts\*" $ScriptFolder -Force   }#DisMount模板VHDXdismount-diskp_w_picpath $Template_VHDX#Remove应答文件和Djoin文件Remove-Item -Path $DjoinSourceRemove-Item -Path $UnattendXml#Copy虚拟机VHDX文件New-item -path $VM_RemotePath\$VM_Name -name "Virtual Hard Disks" -ItemType directoryCopy-Item -Path $Template_VHDX -Destination $VM_VHDRemotePath#新建虚机New-VM -Name $VM_Name -ComputerName $VM_HostName -Generation 2 -MemoryStartupBytes $VM_Memory -SwitchName $NetworkSwitch -Path $VM_Path -VHDPath $VM_VHDPath#设置CPU个数Set-VM -Name $VM_Name -ComputerName $VM_HostName -ProcessorCount $VM_CpuCount#禁用动态内存功能#Set-VMMemory -Name $VM_Name -ComputerName $VM_HostName -DynamicMemoryEnabled $False  #添加DVDDriveGet-VM -Name $VM_Name -ComputerName $VM_HostName |Add-VMDvdDrive -ControllerNumber 0#设置VLANID#Set-VMNetworkAdapterVlan -ComputerName $VM_HostName -VMName $VM_Name -Access -VlanId 1112#通过SCVMM分配静态MACAddress#Import-Module virtualmachinemanagerRead-SCVMHost -VMHost $VM_HostName |Out-Null$VM=Get-SCVirtualMachine -Name $VM_Name$Adapter=$VM.VirtualNetworkAdapters[0]Set-SCVirtualNetworkAdapter -VirtualNetworkAdapter $Adapter[0] -MACAddressType "Static" -MACAddress "00-00-00-00-00-00" |Out-Null#启动虚机#Start-VM -Name $VM_Name -ComputerName $VM_HostNameStart-SCVirtualMachine -VM $VM_Name
0