我已经创build了一个基本脚本来快速添加Hyper-V中的虚拟机,并且一切都很好,直到达到Set-VMMemory命令。 在这一点上,variables似乎失败并产生一个错误。
脚本代码:
$Name = Read-Host -Prompt 'New VM Name' $ProcessorCount = Read-Host -Prompt 'Processor Count' $MinimumBytes = Read-Host -Prompt 'Dynamic Memory Minimum' $MemoryStartupBytes = Read-Host -Prompt 'Memory Startup Bytes' $MaximumBytes = Read-Host -Prompt 'Dynamic Memory Maximum' $Priority = Read-Host -Prompt 'Dynamic Memory Priority' $Buffer = Read-Host -Prompt 'Dynamic Memory Buffer' $VlanId = Read-Host -Prompt 'VLAN ID' New-VM -Name "$Name" -Path H:\VM –NewVHDPath H:\VHD\$Name\$Name.VHDX -NewVHDSizeBytes 64GB -SwitchName "INFRASTRUCTURE" Set-VM -Name "$Name" -ProcessorCount "$ProcessorCount" Set-VMMemory "$Name" -DynamicMemoryEnabled $true -MinimumBytes $MinimumBytes -StartupBytes $MemoryStartupBytes -MaximumBytes $MaximumBytes -Priority $Priority -Buffer $Buffer Set-VMNetworkAdapterVlan –VMName "$Name" –Access –VlanId "$VlanId"
错误代码:
Set-VMMemory : 'test' failed to modify device 'Memory'. (Virtual machine ID 17109661-11E1-4213-97DA-19C5847C8F87) Invalid startup memory amount assigned for 'test'. The minimum amount of memory you can assign to this virtual machine is '32' MB. (Virtual machine ID 17109661-11E1-4213-97DA-19C5847C8F87) A parameter that is not valid was passed to the operation. At line:12 char:1 + Set-VMMemory "$Name" -DynamicMemoryEnabled $true -MinimumBytes $MinimumBytes -St ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (Microsoft.HyperV.PowerShell.VMTask:VMTask) [Set-VMMemory], VirtualizationOperationFailedException + FullyQualifiedErrorId : InvalidParameter,Microsoft.HyperV.PowerShell.Commands.SetVMMemoryCommand
我试着改变语法,但结果是相同或相似的结果。 任何可以提供车轮脱落的见解都将不胜感激。
正确的脚本添加了一些默认值选项:再次感谢@彼得·汉多夫指出我在正确的方向。
$Name = Read-Host -Prompt 'New VM Name' $ProcessorCount = Read-Host "Processor Count (Press [Enter] to choose 2): " if ($ProcessorCount -eq ""){$ProcessorCount="2"} ; if ($ProcessorCount -eq $NULL){$ProcessorCount="2"} [long]$MinimumBytes = Invoke-Expression (Read-Host -Prompt 'Dynamic Memory Minimum') [long]$MemoryStartupBytes = Invoke-Expression (Read-Host -Prompt 'Memory Startup Bytes') [long]$MaximumBytes = Invoke-Expression (Read-Host -Prompt 'Dynamic Memory Maximum') [long]$VHDiskSize = Invoke-Expression (Read-Host -Prompt 'VHDX Size') $Priority = Read-Host "Dynamic Memory Priority (Press [Enter] to choose 50): " if ($Priority -eq ""){$Priority="50"} ; if ($Priority -eq $NULL){$Priority="50"} $Buffer = Read-Host "Dynamic Memory Buffer (Press [Enter] to choose 20): " if ($Buffer -eq ""){$Buffer="20"} ; if ($Buffer -eq $NULL){$Buffer="20"} $VlanId = Read-Host "Select Vlan ID (Press [Enter] to choose 2): " if ($VlanId -eq ""){$VlanId="2"} ; if ($VlanId -eq $NULL){$VlanId="2"} New-VM -Name "$Name" -Path H:\VM –NewVHDPath H:\VHD\$Name\$Name.VHDX -NewVHDSizeBytes $VHDiskSize -SwitchName "INFRASTRUCTURE" Set-VM -Name "$Name" -ProcessorCount "$ProcessorCount" Set-VMMemory "$Name" -DynamicMemoryEnabled $true -MinimumBytes "$MinimumBytes" -StartupBytes "$MemoryStartupBytes" -MaximumBytes "$MaximumBytes" -Priority "$Priority" -Buffer "$Buffer" Set-VMNetworkAdapterVlan –VMName "$Name" –Access –VlanId "$VlanId"
使用Read-Host时,您将得到一个string,而KB / GB运算符的处理方式与预期的整数不同。 您需要将您的input转换为一个整数,如:
[int]$MinimumBytes = Invoke-Expression (Read-Host -Prompt 'Dynamic Memory Minimum') [int]$MemoryStartupBytes = Invoke-Expression (Read-Host -Prompt 'Memory Startup Bytes') [int]$MaximumBytes = Invoke-Expression (Read-Host -Prompt 'Dynamic Memory Maximum')
我很less使用Read-Host,脚本参数对于获取用户inputfunction要强大得多,而且不会像这样的问题。
在你的脚本的开始你有:
param( [parameter(Mandatory=$true)] [string]$Name, [int]$ProcessorCount = 2, [long]$MinimumBytes = 512MB ... )
然后你会这样调用脚本:
ScriptName.ps1 -Name "new VM" -ProcessCount 4
参数可以是非常有用的,在TechNet的更多信息: about_Parameters和about_Functions_Advanced_Parameters