Private/Set-TagOnVM.ps1

function Global:Set-TagOnVM {
    [CmdletBinding()]
    param(        
        [Parameter(Mandatory = $true)]
        [string]
        $VMName,        
        [Parameter(Mandatory = $true)]
        [string]
        $TagName,
        [Parameter(Mandatory = $true)]
        [string]
        $TagValue
    )
    process {        
        $resource = Get-AzResource -ResourceGroupName $ResourceGroupName -Name $VMName
        $existingTags = $resource.Tags
        if ($existingTags.Count -ne 0) {            
            $existingTags.Add($TagName, $TagValue)
            Set-AzResource -ResourceId $resource.Id -Tag $existingTags -Force | Out-Null
        }
        else {            
            Set-AzResource -ResourceId $resource.Id -Tag @{$TagName = $TagValue } -Force | Out-Null
        }
    }    
}