AzureRM.psm1

#Requires -RunAsAdministrator

$AzureRMProfileVersion = "0.9.8";

$AzureRMModules = @{
  "Azure.Storage" = "0.9.8";
  "AzureRM.ApiManagement" = "0.9.8";
  "AzureRM.Automation" = "0.9.8";
  "AzureRM.Backup" = "0.9.8";
  "AzureRM.Batch" = "0.9.8";
  "AzureRM.Compute" = "0.9.8";
  "AzureRM.DataFactories" = "0.9.8";
  "AzureRM.Dns" = "0.9.8";
  "AzureRM.HDInsight" = "0.9.8";
  "AzureRM.Insights" = "0.9.8";
  "AzureRM.KeyVault" = "0.9.8";
  "AzureRM.Network" = "0.9.8";
  "AzureRM.OperationalInsights" = "0.9.8";
  "AzureRM.Profile" = "0.9.8";
  "AzureRM.RedisCache" = "0.9.8";
  "AzureRM.Resources" = "0.9.8";
  "AzureRM.SiteRecovery" = "0.9.8";
  "AzureRM.Sql" = "0.9.8";
  "AzureRM.Storage" = "0.9.8";
  "AzureRM.StreamAnalytics" = "0.9.8";
  "AzureRM.Tags" = "0.9.8";
  "AzureRM.TrafficManager" = "0.9.8";
  "AzureRM.UsageAggregates" = "0.9.8";
  "AzureRM.Websites" = "0.9.8"
}

function Import-ModuleWithVersionCheck([string]$Name,[string]$MinimumVersion,[string]$Repository,[string]$Scope)
{
  $minVer = $MinimumVersion
  $maxVer = "$($minVer.Split(".")[0]).9999.0"
  try {
    if ([string]::IsNullOrWhiteSpace($Repository)) 
    {
      Install-Module -Name $Name -Scope $Scope -MinimumVersion $minVer -MaximumVersion $maxVer -ErrorAction Stop
    } else {
      Install-Module -Name $Name -Repository $Repository -Scope $Scope -MinimumVersion $minVer -MaximumVersion $maxVer -ErrorAction Stop
    } 
    $v = (Get-InstalledModule -Name $Name)[0].Version.ToString()
    Write-Output "$Name $v installed..." 
  } catch {
    Write-Warning "Skipping $Name package..."
    Write-Warning $_
  }
}

<#
 .Synopsis
  Install Azure Resource Manager cmdlet modules
 
 .Description
  Installs all the available Azure Resource Manager cmdlet modules.
 
 .Parameter Repository
  Limit the search for "AzureRM" cmdlets in a specific repository.
  
 .Parameter Scope
  Specifies the parameter scope.
#>

function Update-AzureRM
{
  param(
  [Parameter(Position=0, Mandatory = $false)]
  [string]
  $Repository,
  [Parameter(Position=1, Mandatory = $false)]
  [ValidateSet("CurrentUser","AllUsers")]
  [string]
  $Scope)

  if ([string]::IsNullOrWhiteSpace($Scope))
  {
    $Scope = "AllUsers"
  }

  Write-Output "Installing AzureRM modules."

  Import-ModuleWithVersionCheck "AzureRM.Profile" $AzureRMProfileVersion $Repository $Scope

  $result = $AzureRMModules.Keys | ForEach {
    Start-Job -Name $_ -ScriptBlock {
      Import-ModuleWithVersionCheck $args[0] $args[1] $args[2] $args[3]
    } -ArgumentList $_, $AzureRMModules[$_], $Repository, $Scope }
  
  $AzureRMModules.Keys | ForEach {Get-Job -Name $_ | Wait-Job | Receive-Job }
}

<#
 .Synopsis
  Remove Azure Resource Manager cmdlet modules
 
 .Description
  Removes all installed Azure Resource Manager cmdlet modules.
#>

function Uninstall-AzureRM
{
  param(
  [Parameter(Position=0, Mandatory = $false)]
  [string]
  $Repository)

  Write-Output "Uninstalling AzureRM modules."

  $installedModules = Get-InstalledModule

  $AzureRMModules.Keys | ForEach {
    $moduleName = $_
    if (($installedModules | where {$_.Name -eq $moduleName}) -ne $null) {
      Uninstall-Module -Name $_ -ErrorAction Stop
      Write-Output "$moduleName uninstalled..." 
    }
  }

  Uninstall-Module -Name "AzureRM.Profile" -ErrorAction Stop
  Write-Output "AzureRM.Profile uninstalled..." 
}

New-Alias -Name Install-AzureRM -Value Update-AzureRM
Export-ModuleMember -function * -Alias *