Expand-VirtualDisk.ps1
<#PSScriptInfo
.VERSION 1.2.0 .GUID 99179600-f3aa-402f-8c0d-7d790673df30 .AUTHOR Tyler Simonson .TAGS VirtualMachineManager, VMM, SCVMM, HardDisk .PROJECTURI https://github.com/tysimo/PSExpandDisk .EXTERNALMODULEDEPENDENCIES VirtualMachineManager .RELEASENOTES #> #Requires -Modules VirtualMachineManager <# .SYNOPSIS PowerShell script for expanding virtual disks. .DESCRIPTION This script will expand a virtual hard disk in VMM and then extend the volume on the corresponding virtual machine. .LINK https://github.com/tysimo/PSExpandDisk .PARAMETER VMMServer Name of Virtual Machine Manager server the virtual machine exists on. .PARAMETER VM Name of virtual machine to expand the disk on. .PARAMETER Drive Drive letter to expand. .PARAMETER NewSize The size in GB to expand the drive to. .PARAMETER SpaceToAdd The additional space in GB to add to the current drive size. .NOTES The parameters NewSize and SpaceToAdd are mutually exclusive and cannot be used together. If neither is specified, the script will default to NewSize and prompt the user for a value. .EXAMPLE .\Expand-VirtualDisk.ps1 -VMMServer devvmm -VM testvm01 -Drive C -NewSize 100 Expand the C: drive on testvm01 to 100 GB. .EXAMPLE .\Expand-VirtualDisk.ps1 -VMMServer devvmm -VM testvm01 -Drive D -SpaceToAdd 10 Add an additional 10 GB of space to the D: drive on testvm01. .EXAMPLE .\Expand-VirtualDisk.ps1 -VMMServer devvmm -VM testvm01 -Drive E Expand the E: drive on testvm01 to the size specified when prompted. The script will display the current drive size before asking for the new size. #> [CmdletBinding(DefaultParameterSetName='NewSize')] param ( [Parameter(Mandatory = $true)] [string] $VMMServer, [Parameter(Mandatory = $true)] [string] $VM, [Parameter(Mandatory = $true)] [string] $Drive, [Parameter(Mandatory = $false, ParameterSetName = 'NewSize')] [int] $NewSize, [Parameter(Mandatory = $true, ParameterSetName = 'SpaceToAdd')] [int] $SpaceToAdd ) Import-Module -Name "VirtualMachineManager" $DiskInfoScript = { param($Drive) $Number = ([string](Get-Partition -DriveLetter $Drive).DiskNumber).Replace(' ','') $Partition = (Get-Partition -DriveLetter $Drive | Where-Object -FilterScript {$_.Type -Eq "Basic"}).PartitionNumber $Size = (Get-Disk -Number $Number).Size Return $Number, $Partition, $Size } $ExtendScript = { param($DiskNumber,$PartitionNumber) $DiskPart = "select disk $DiskNumber list partition select partition $PartitionNumber extend" $DiskPart | diskpart | Out-Null } Get-SCVMMServer -ComputerName $VMMServer | Out-Null $DiskInfo = Invoke-Command -ComputerName $VM -ScriptBlock $DiskInfoScript -Argumentlist $Drive $DiskNumber = $DiskInfo[0] $PartitionNumber = $DiskInfo[1] $Size = [math]::round($DiskInfo[2] / 1GB,1) $Lun = (Get-WmiObject win32_diskdrive -ComputerName $VM | Where-Object {$_.DeviceID -like "\\.\PHYSICALDRIVE"+$DiskNumber}).SCSILogicalUnit switch ($psCmdlet.ParameterSetName) { "NewSize" { If (!$NewSize) { Write-Host "Current size:"$Size -ForegroundColor "Yellow" $NewSize = Read-Host "New size" } } "SpaceToAdd" { $NewSize = $Size + $SpaceToAdd } } Write-Host "Expanding virtual disk in VMM..." -ForegroundColor "Yellow" Get-SCVirtualMachine $VM | Get-SCVirtualDiskDrive | Where-Object {$_.Bus -eq 0 -and $_.Lun -eq $Lun} | Expand-SCVirtualDiskDrive -VirtualHardDiskSizeGB $NewSize | Out-Null Write-Host "Extending volume on virtual machine..." -ForegroundColor "Yellow" Invoke-Command -ComputerName $VM -ScriptBlock $ExtendScript -Argumentlist $DiskNumber,$PartitionNumber |