Install-ALNugetPackage.ps1

function Install-ALNugetPackage
{
    [CmdletBinding()]
    Param(
        $PackageName,
        $Version,
        $Source,
        $ApiKey,
        $SourceUrl,
        $DependencyVersion='Highest',
        [switch]$ExactVersion, #do not use DependencyVersion for the main package
        $TargetPath,
        $Key,
        $IdPrefix #Will be used before AppName and all Dependency names
    )
    #$sources = Get-PackageSource | Where-Object {$_.Name -eq $Source}
    #if (-not $sources) {
        #Write-Host "Adding nuget source..."
        #Write-Verbose "nuget.exe sources Add -Name `"$Source`" -Source `"$SourceUrl`""
    if ($SourceUrl) {
        $exists = nuget.exe sources list -Format short | Where-Object {$_ -like "*$($SourceUrl)"}
        if ($exists) {
            Write-Host "Source already exists"
        } else {
            nuget.exe sources Add -Name "$Source" -Source "$SourceUrl"
        }
        if ($Key) {
            Write-Host "Update source key"
            nuget.exe source update -Name "$Source" -Username 'user' -Password $Key -StorePasswordInClearText
        }
    }
    $TempFolder = Join-Path $env:TEMP 'ALNugetApps'
    if (Test-Path $TempFolder) {
        Remove-Item $TempFolder -Force -Recurse | Out-Null
    }

    if (-not $ExactVersion) {
        if ($Version -and ($DependencyVersion -eq 'HighestMinor')) {
            Write-Host "Listing available versions"
            $Versions = nuget.exe list -Source "$Source" -AllVersions -NonInteractive "$IdPrefix$(Format-AppNameForNuget $PackageName)" | Where-Object {$_ -like "$IdPrefix$(Format-AppNameForNuget $PackageName) *"}
            $VersionNos = $versions | foreach-object {$V=[version]$_.Split(' ')[1];If ($V.Revision -eq -1) {$V = [version]"$($V.Major).$($V.Minor).$($V.Build).0"};$V}
            $V = [version]$Version
            switch ($true) {
                ($V -like '*.0.0.0') {$M = "$($V.Major).*.*.*";break}
                ($V -like '*.*.0.0') {$M = "$($V.Major).*.*.*";break}
                ($V -like '*.*.*.0') {$M = "$($V.Major).$($V.Minor).*.*";break}
                ($V -like '*.*.*.*') {$M = "$($V.Major).$($V.Minor).$($V.Build).*";break}
            }
            $LatestVersion = $VersionNos | Sort-Object -Descending | Where-Object {$_ -like $M} | Select-Object -First 1
            Write-Host "Latest version for requested $Version is $LatestVersion"
            $Version = $LatestVersion
        }
        if ($Version -and ($DependencyVersion -eq 'Lowest')) {
            Write-Host "Listing available versions"
            $Versions = nuget.exe list -Source "$Source" -AllVersions -NonInteractive "$IdPrefix$(Format-AppNameForNuget $PackageName)" | Where-Object {$_ -like "$IdPrefix$(Format-AppNameForNuget $PackageName) *"}
            $VersionNos = $versions | foreach-object {$V=[version]$_.Split(' ')[1];If ($V.Revision -eq -1) {$V = [version]"$($V.Major).$($V.Minor).$($V.Build).0"};$V}
            $V = [version]$Version
            switch ($true) {
                ($V -like '*.0.0.0') {$M = "$($V.Major).*.*.*";break}
                ($V -like '*.*.0.0') {$M = "$($V.Major).$($V.Minor).*.*";break}
                ($V -like '*.*.*.0') {$M = "$($V.Major).$($V.Minor).$($V.Build).*";break}
                ($V -like '*.*.*.*') {$M = "$($V.Major).$($V.Minor).$($V.Build).$($V.Revision)";break}
                }
            $LatestVersion = $VersionNos | Sort-Object | Where-Object {$_ -like $M} | Select-Object -First 1
            Write-Host "Lowest version for requested $Version is $LatestVersion"
            $Version = $LatestVersion
        }
    }
    New-Item -Path $TempFolder -ItemType directory -Force | Out-Null
    Write-Host "Installing package '$IdPrefix$(Format-AppNameForNuget $PackageName)' version $($Version) $DependencyVersion from '$Source' to $TargetPath..."
    if ($Version) {
        if ($Source) {
            nuget.exe install -Source "$Source" -Version $Version -OutputDirectory $TempFolder -NoCache -DependencyVersion $DependencyVersion "$IdPrefix$(Format-AppNameForNuget $PackageName)"
        } else {
            nuget.exe install -Version $Version -OutputDirectory $TempFolder -NoCache -DependencyVersion $DependencyVersion "$IdPrefix$(Format-AppNameForNuget $PackageName)"
        }
    } else {
        if ($Source) {
            nuget.exe install -Source "$Source" -OutputDirectory $TempFolder -NoCache -DependencyVersion $DependencyVersion "$IdPrefix$(Format-AppNameForNuget $PackageName)"
        } else {
            nuget.exe install -OutputDirectory $TempFolder -NoCache -DependencyVersion $DependencyVersion "$IdPrefix$(Format-AppNameForNuget $PackageName)"
        }
    }
    Write-Host "Moving app files from $TempFolder to $TargetPath..."
    Get-ChildItem -Path $TempFolder -Filter *.app -Recurse | Copy-Item -Destination $TargetPath -Container -Force | Out-Null
    Write-Host "Removing folder $TempFolder..."
    Remove-Item $TempFolder -Force -Recurse | Out-Null
}