Как я могу использовать оператор IF, чтобы определить количество свободного места на диске, которое нужно добавить в VMDK?

Сценарий, который я использую, приведен ниже. Мы обновляем наши 1500 VDI с Windows 10 1809 до 1909 и хотим максимально автоматизировать этот процесс, поскольку это будет процесс, который нам придется выполнять регулярно с каждой новой версией Windows. Мы используем SCCM (System Center Configuration Manager). Скрипт идеально подходит для расширения дискового пространства для нескольких машин. CSV-файл, который он импортирует, содержит только список виртуальных машин, на которых скрипт должен расширить дисковое пространство. Я хочу использовать оператор if, чтобы определить, меньше ли объем свободного места 30 ГБ, и, если да, добавить необходимое дисковое пространство, чтобы довести его до 30 ГБ свободного места. Пример: если свободное место на диске равно -lt 30 ГБ, Set-HardDisk -CapacityGB (разница в том, чтобы сделать доступным 30 ГБ свободного места), если свободное пространство равно -eq 30 ГБ, ничего не делать. Я исследовал Google и этот сайт в поисках чего-то отдаленно похожего и не смог найти то, что мне нужно. Любая помощь в этом приветствуется.

##Task Change Disk Size
##Variable clear
$csvobjects = @()
$cskobject = @()
$network = @()
$isalive = @()

##Import VM name(s)
$csvobjects = Import-CSV -path "C:\Temp\ExpandHDDiskList.csv"

Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

connect-viserver -server anyserver.com -User [email protected]

foreach ($csvobject in $csvobjects){
##Variable clear
$network = @()
$isalive = @()
##Pre-change data gathering
$beforechange = (GET-VM -Name $csvobject.vmname | FT -auto CapacityGB|out-string)
##Stop VM
GET-VM -Name $csvobject.vmname | Get-HardDisk -Name 'Hard disk 1' | Set-HardDisk -CapacityGB 75 -Confirm:$false
start-sleep -s 60

# Variable specifying the drive you want to extend
$drive_letter = "C"

# Script to get the partition sizes and then resize the volume
$size = (Get-PartitionSupportedSize -DriveLetter $drive_letter)
Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax
}

person webby68    schedule 05.02.2021    source источник


Ответы (1)


Вы можете использовать Get-VMGuest, чтобы получить свободное место на гостевой виртуальной машине.

Установите целевое количество свободного места в переменной. 30 ГБ (ГБ = 1024^3)

$gb = 1024 * 1024 * 1024
$space = 30 * $gb

Получите свободное место с виртуальной машины, используя Get-VMGuest

$vm = Get-VMGuest $csvobject.vmname

Теперь, предположив, что в машине есть один жесткий диск, определите, меньше ли свободного места на нем 30 ГБ. Если это так, увеличьте размер жесткого диска, чтобы было 30 ГБ свободного места. При расчете берется емкость диска и добавляется необходимое свободное пространство (30 ГБ), а затем вычитается текущее свободное пространство. Все это делается в байтах, поэтому преобразуйте его в ГБ и округлите до целого числа, чтобы избежать странных размеров диска:

if ($vm.Disks[0].FreeSpace -lt $space) {
   Get-HardDisk $vm.Vm | Select -first 1 | Set-HardDisk -CapacityGB ([math]::round(($vm.Disks[0].Capacity + $space - $vm.Disks[0].FreeSpace) / $gb))
}

Будьте осторожны при запуске, особенно если у вас есть машины с несколькими жесткими дисками.

Предполагая виртуальные машины Windows, вам не нужно останавливать виртуальную машину. Вы можете удаленно изменить размер файловой системы, используя Invoke-Command или Invoke-VMScript.

person Mark Elvers    schedule 05.02.2021
comment
Спасибо за перспективное решение. Я проверил это, и это работает, однако я не уверен, как это работает. Кажется, что он устанавливает дисковое пространство не просто в ГБ, а в 75,53621673583984. Я не совсем понимаю 1024*1024*1024, и как это устанавливает размер диска в 75 гб. Не могли бы вы объяснить это решение? Спасибо. - person webby68; 17.02.2021
comment
Привет, я обновил свой ответ, чтобы дать более подробное объяснение и решить проблему со странными размерами дисков. - person Mark Elvers; 18.02.2021
comment
это имеет больше смысла в понимании этого. Я в значительной степени понял это, но ваше объяснение проясняет то, что я не понял. Я проверил машину, на которой я тестирую это, и она установлена ​​​​на 70 ГБ и имеет 11 ГБ свободного места, поэтому для правильной работы этого сценария он расширит диск до 89 общей емкости. Однако это не так. Первое изображение показывает размер диска, а второе изображение показывает запрос на разрешение увеличить емкость диска до 75 (а не 89, как должно быть), последнее изображение показывает ошибку, которую я получаю. Установка его меньше, чем фактический размер. Ссылки на изображения ниже - person webby68; 18.02.2021
comment
ibb.co/VpYFc8q ibb.co/0ZvD2dg ibb.co/PZY7Myn - person webby68; 18.02.2021
comment
Возможно, вы могли бы опубликовать свой текущий сценарий где-нибудь? - person Mark Elvers; 18.02.2021
comment
Вы можете увидеть текущий код здесь. codeshare.io/5onxJM - person webby68; 18.02.2021
comment
Код в моем ответе (строки 41-46 вашего кода) использует $csvobject в качестве имени машины ввода. Там, где у вас есть это в вашем скрипте, $csvobject не инициализировано, и вы просто выбираете какое-то старое значение. Вам нужно переместить его в цикл в строке 48, вероятно, примерно в строке 54. - person Mark Elvers; 18.02.2021
comment
Поэтому я добавляю вашу часть скрипта прямо под foreach в строках 43-47. Скрипт запускается, но завершается без каких-либо действий. Я запустил отладчик, и, вступая в код, он перескакивает через ваш скрипт и завершается. Вот новый код. Я не уверен, что мне не хватает. codeshare.io/5Prw8d - person webby68; 18.02.2021
comment
Давайте продолжим обсуждение в чате. - person webby68; 18.02.2021
comment
Я пытался общаться в чате, но вас, кажется, там нет. Я раньше не пользовался чатом. Во всяком случае, похоже, что ваш цикл может быть пустым. Содержит ли ваш файл CSV "C:\Temp\ExpandHDskList.csv" данные. Попробуйте добавить Write-Host $csvObject.vmname в цикл, чтобы увидеть, какие машины учитываются. - person Mark Elvers; 18.02.2021