批量创建Hyper-V虚拟机时启动顺序报错的解决方法咨询
解决Hyper-V批量创建VM时Set-VMBios启动顺序报错问题
报错信息
Set-VMBios : Cannot validate argument on parameter ‘StartupOrder’. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. At C:\Users\Administrator\Documents\v6\vmsv6.ps1:40 char:46 Set-VMBios -VMName $VMName -StartupOrder $DVD CategoryInfo : InvalidData: (:) [Set-VMBios], ParameterBindingValidationException FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.HyperV.PowerShell.Commands.SetVMBios
原脚本
for ($Counter=1; $Counter -le 2; $Counter++) { $VMName = "VM0" + $Counter $Generation = 1 $Cpu = 2 $Memory = 1024MB $VMPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\$VMName" $ISOPath = "C:\Users\Administrator\Downloads\WindowsServer2019.iso" $VHDXPath = "$VMPath\DATA_Disk.vhdx" $VHDSize = 1GB New-VM -Name $VMName -Path $VMPath -MemoryStartupBytes $Memory -Generation $Generation Set-VMProcessor -VMName $VMName -Count $Cpu New-VHD -SizeBytes $VHDSize -Path $VHDXPath -Fixed Add-VMHardDiskDrive -VMName $VMName -Path $VHDXPath -ControllerNumber 0 -ControllerLocation 0 Add-VMDvdDrive -VMName $VMName -Path $ISOPath -ControllerNumber 0 -ControllerLocation 1 $Bios = Get-VMBios -VMName $VMName $DVD = $Bios.BootOrder | Where-Object { $_.DeviceType -eq ‘DvdDrive’ } Set-VMBios -VMName $VMName -StartupOrder $DVD Start-VM -Name $VMName }
问题分析与解决方法
核心问题
- 中文引号导致匹配失败:脚本中
Where-Object使用了中文单引号‘DvdDrive’,PowerShell无法识别该符号,导致$DVD变量为空。 - 参数格式错误:
Set-VMBios的-StartupOrder参数要求传入完整的启动设备数组,而非单个设备对象,仅传DVD设备不符合参数要求。
修改步骤
- 将中文单引号替换为英文单引号,确保
Where-Object能正确筛选出DVD设备。 - 构造完整的启动顺序数组:将DVD设备移至启动顺序首位,保留其他原有启动设备。
- 可选添加短暂延迟,确保Hyper-V完成设备添加同步后再获取BIOS信息。
修改后的完整脚本
for ($Counter=1; $Counter -le 2; $Counter++) { $VMName = "VM0" + $Counter $Generation = 1 $Cpu = 2 $Memory = 1024MB $VMPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\$VMName" $ISOPath = "C:\Users\Administrator\Downloads\WindowsServer2019.iso" $VHDXPath = "$VMPath\DATA_Disk.vhdx" $VHDSize = 1GB New-VM -Name $VMName -Path $VMPath -MemoryStartupBytes $Memory -Generation $Generation Set-VMProcessor -VMName $VMName -Count $Cpu New-VHD -SizeBytes $VHDSize -Path $VHDXPath -Fixed Add-VMHardDiskDrive -VMName $VMName -Path $VHDXPath -ControllerNumber 0 -ControllerLocation 0 Add-VMDvdDrive -VMName $VMName -Path $ISOPath -ControllerNumber 0 -ControllerLocation 1 # 延迟1秒确保设备同步 Start-Sleep -Seconds 1 $Bios = Get-VMBios -VMName $VMName # 使用英文引号筛选DVD设备 $DVD = $Bios.BootOrder | Where-Object { $_.DeviceType -eq 'DvdDrive' } # 构造完整启动顺序:DVD优先,其余设备按原有顺序 $newStartupOrder = @($DVD) + ($Bios.BootOrder | Where-Object { $_.DeviceType -ne 'DvdDrive' }) Set-VMBios -VMName $VMName -StartupOrder $newStartupOrder Start-VM -Name $VMName }
内容的提问来源于stack exchange,提问作者Ram Fuertes
相关产品推荐
相关产品推荐

