public/Set-AzureVMSize.ps1

function Set-AzureVMSize {
[cmdletbinding()]

param (
    
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$VMName,
    
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$NewVMSize,
    
    [Parameter(Mandatory=$true)]
    [string]$subscriptionName

)

    Process 
    {

        # check to see if local token exists (ran Login-AzureRMAccount)
        if (($null -eq (Get-AzureRmContext).Account)) {
            Write-Warning "Please run < Login-AzureRMAccount > first to create a session token...exiting."
            break
        } 

        # Get subscription name
        Try {
            Select-AzureRmSubscription -SubscriptionName $subscriptionName -ErrorAction Stop -Verbose | Out-Null
        }
        Catch {
            $error[0].Exception
            break
        }

        Try {
            # couldn't explicitly get the vm for whatever reaso by passing the rg and vm name's as string....so doing the below :( I <3 Microsoft.
            $vm = Get-AzureRmResource -ErrorAction Stop -Verbose | 
            Where-Object {$_.name -like $VMName -and $_.resourcetype -eq 'Microsoft.Compute/virtualMachines'}
            $vm = $vm | Get-AzureRmVM

            if ($null -eq $VM) {
                Write-Warning "VM cannot be found, ensure you've referenced the correct subscription, or check your spelling and try again..."
                break
            }

            $vm.HardwareProfile.VmSize = $NewVMSize
        }
        Catch {
            $error[0].Exception
            break
        }
        
        Try {
            $results = $vm | Update-AzureRmVM -ErrorAction Stop -Verbose
        }
        Catch {
            $error[0].Exception
            break
        }

        return $results

    } #end process block

}