我需要一个脚本帮助我检查可用磁盘空间是否为 30GB,如果少于 30GB,则将其增加到差值以使可用空间为 30。我需要这个脚本适用于 1500 个虚拟机,以便可以自动一次调整 30 个虚拟机的大小。在其他地方请求帮助时,提供了一个脚本来完成我的请求,但没有解释它是如何工作的,也没有解释数学原理。虚拟机硬盘为 70GB,有 24GB 的可用空间。所以我只需要在硬盘上扩展 6GB。脚本如下:
$space = 30 * 1024 * 1024 * 1024
$vm = Get-VMGuest $csvobject.vmname
if ($vm.Disks[0].FreeSpace -lt $space) {
Get-HardDisk $vm.Vm | Select -first 1 | Set-HardDisk -CapacityGB (($vm.Disks[0].Capacity + $space - $vm.Disks[0].FreeSpace) / (1024 * 1024 * 1024))
虽然我对 PowerShell 并不陌生,但我还有很多东西要学。下面的脚本没有将 VM 磁盘设置为固定的 GB 大小,而是将其设置为 75.53621673583984。这不是我需要的。此外,当我对其他驱动器运行脚本时,在实际运行之前,我得到了以下内容(见屏幕截图)。
我选择“全部是”,然后出现以下错误。
Set-HardDisk : 2/17/2021 2:14:22 PM Set-HardDisk The specified size '78219344' is less than actual size of the virtual disk '79205464'.
At line:4 char:44
+ ... -first 1 | Set-HardDisk -CapacityGB (($vm.Disks[0].Capacity + $space ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-HardDisk], InvalidArgument
+ FullyQualifiedErrorId : Client20_VirtualDeviceServiceImpl_TryValidateHardDiskNewSize_InvalidSize,VMware.VimAutomation.ViCore.Cmdlets.Commands.VirtualDevice.SetHardDisk
我不明白这个错误。看来脚本试图将驱动器空间设置为 78219344GB,同时读取当前磁盘大小为 79205464GB。我确信我误读了这个错误,但如果能帮助解释该脚本及其工作原理和错误,我将不胜感激。最终,我只需要一个带有“if”语句的脚本,该脚本将检查 VM 可用驱动器空间,如果少于 30GB,则仅将驱动器空间扩展必要的量,使其等于 30GB 可用驱动器空间。
答案1
下面是我正在使用的完整脚本。此脚本读取 .csv 文件以获取虚拟机列表,以检查虚拟机的可用磁盘空间,如果不等于 30GB,则扩展驱动器空间以弥补差额。我只是需要帮助让“if”语句工作。我运行了调试器并遍历每个断点,发现当程序到达“if”语句时,它完全跳过了它并且程序不做任何事情就结束了。在本网站成员的帮助下,我确定我需要将“if”状态移动到循环内。一旦我这样做并注释掉一些我不再需要的行,脚本就可以完美运行。感谢所有提供意见帮助我解决这个问题的人。
##Task Change Disk Size
##Variable clear
$csvobjects = @()
$cskobject = @()
$network = @()
$isalive = @()
#Get VM's to add disk space to
#$GetFreeSpace = Get-WmiObject Win32_LogicalDisk -ComputerName $Computer -Filter DriveType=3 | Select-Object DeviceID, @{'Name'='Size (GB)'; 'Expression'={[math]::truncate($_.size / 1GB)}}, @{'Name'='Freespace (GB)'; 'Expression'={[math]::truncate($_.freespace / 1GB)}}
#Export to CSV
#$dateTime | Export-Csv -NoTypeInformation -Path "D:\_Tools\PowerShell_CLI_HardDriveExpand-DiskFreeSpace-$(Get-Date -Format "yyyyMMddHHmmssff").csv" -Append
## Creates encrypted password and stores it in the path specified. Only needs to be done once. To change the password, uncomment script string below,
##delete "mysecurestring.txt", run the script, add new password and new encrypted file will be created.
#read-host -assecurestring | convertfrom-securestring | out-file C:\Temp\mysecurestring.txt
## Wherever you see a -Credential argument on a PowerShell command then it means you can pass a PSCredential
$username = "domain.com\user.admin"
$password = Get-Content 'C:\Temp\mysecurestring.txt' | ConvertTo-SecureString
$cred = new-object -typename System.Management.Automation.PSCredential `
-argumentlist $username, $password
##Import VM name(s)
$csvobjects = Import-CSV -path "C:\Temp\ExpandHDskList.csv"
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false
connect-viserver -server anyserver.domain.com -Credential $cred
#connect-viserver -server anotherserver.domain.com -Credential $cred
#Write-Host "Hard Disk Space is equal to or less than 80GB."##Task Change Disk Size
##Variable clear
$network = @()
$isalive = @()
foreach ($csvobject in $csvobjects){
$gb = 1024 * 1024 * 1024
$space = 30 * $gb
$vm = Get-VMGuest $csvobject.vmname
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))
}
##Variable clear
$network = @()
$isalive = @()
##Pre-change data gathering
$beforechange = (GET-VM -Name $csvobject.vmname | FT -auto CapacityGB|out-string)
# 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
}