Назад | Перейти на главную страницу

Сценарий PowerShell для создания виртуальной машины в 2012 R2 дает сбой при настройке размера памяти

Я создал базовый сценарий для быстрого добавления виртуальной машины в Hyper-V, и все работает отлично, пока не достигнет Set-VMMemory команда. В этот момент кажется, что переменные не работают и генерируют ошибку.

Код сценария:

$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

Я попытался изменить синтаксис, но получил такие же или похожие результаты. Мы будем очень благодарны за любую информацию о том, где отваливаются колеса.

ИСПРАВЛЕННЫЙ СЦЕНАРИЙ С НЕСКОЛЬКО ДОБАВЛЕННЫХ ОПЦИЙ ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ: Еще раз спасибо @Peter Hahndorf за то, что указал мне в правильном направлении.

$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 вы получаете строку, а оператор KB / GB не обрабатывается так же, как при ожидании целого числа. Вам нужно преобразовать введенные вами данные в целое число, например:

 [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')

Я почти никогда не использую Read-Host, параметры сценария намного эффективнее для получения пользовательского ввода, и у вас не возникнет проблем, подобных этой.

В начале вашего скрипта у вас есть:

 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