Recently MS updated Package Provider installation to dynamic.
This allows one liner to act on various states of nuGet to install/update/confirm latest version:
Example 3: Dynamically get a package provider
Get-PackageProvider -Name "nuGet" -ForceBootstrap |
Select-Object -Property Name, Version |
Format-Table -Autosize
This way if/else is not needed, and also knowing existing/repository version is not needed as well.
Here is my tested in various package/module cases script (updated):
# array of modules to install (update) / variables
Clear-Host
$ErrorActionPreference = "SilentlyContinue"
$debugPreference = "Continue"
$sqlModule = @("PowershellGet", "sqlserver", "dbaTools")
# Dynamically check/install/update Package Provider
Get-PackageProvider -Name "nuGet" -ForceBootstrap |
Select-Object -Property Name, Version |
Format-Table -Autosize
# Force install/update modules from PS Repositry
$sqlModule.ForEach( {if (-not (Get-Module -Name $_ -ListAvailable) ){
Install-Module -Name $_ -AllowClobber -Confirm:$False -Scope AllUsers -Force | Import-Module | Write-Host "Module $($_) imported"
} else {
# powershell -NoProfile -NonInteractive -Command "Remove-Module $($_) -Force"
Get-InstalledModule -Name $_ | Uninstall-Module -AllVersions -Force -Verbose
Install-Module -Name $_ -AllowClobber -Confirm:$False -Scope AllUsers -Force | Import-Module | Write-Host "Module $($_) imported"
}
}
)
# disable "dbtools" imported notification
Set-DbatoolsConfig -Name Import.SqlpsCheck -Value $false -PassThru |
Register-DbatoolsConfig
# Import installed modules
# $sqlModule.ForEach( {if(Get-Module -Name $_ -ListAvailable){
# Import-Module -Name $_ | Write-Host "Module $($_) imported"
# } else {
# Write-Host "Module $($_) not imported" -ForegroundColor Red -BackgroundColor White
# }
# }
# )
# List modules
Get-Module -ListAvailable |
Where-Object {
$_.Name -match $sqlModule[0] -or
$_.Name -match $sqlModule[1] -or
$_.Name -match $sqlModule[2] } |
Select-Object -Property Name, Version |
Format-Table -AutoSize