Skip to content

Instantly share code, notes, and snippets.

@mattpodwysocki
Created November 29, 2011 21:25
Show Gist options
  • Select an option

  • Save mattpodwysocki/1406580 to your computer and use it in GitHub Desktop.

Select an option

Save mattpodwysocki/1406580 to your computer and use it in GitHub Desktop.

Revisions

  1. mattpodwysocki created this gist Nov 29, 2011.
    69 changes: 69 additions & 0 deletions download-entries.ps1
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,69 @@
    # --- settings ---
    $feedUrlBase = "http://go.microsoft.com/fwlink/?LinkID=206669"
    # the rest will be params when converting to funclet
    $latest = $true
    $overwrite = $false
    $top = $null #use $top = $null to grab all
    $destinationDirectory = "C:\\NuGetLocal"
    # --- locals ---
    $webClient = New-Object System.Net.WebClient
    # --- functions ---
    # download entries on a page, recursively called for page continuations
    function DownloadEntries {
    param ([string]$feedUrl)
    $feed = [xml]$webClient.DownloadString($feedUrl)
    $entries = $feed.feed.entry
    $progress = 0

    foreach ($entry in $entries) {
    $url = $entry.content.src
    $fileName = $entry.properties.id + "." + $entry.properties.version + ".nupkg"
    $saveFileName = join-path $destinationDirectory $fileName
    $pagepercent = ((++$progress)/$entries.Length*100)
    if ((-not $overwrite) -and (Test-Path -path $saveFileName))
    {
    write-progress -activity "$fileName already downloaded" -status "$pagepercent% of current page complete" -percentcomplete $pagepercent
    continue
    }
    write-progress -activity "Downloading $fileName" -status "$pagepercent% of current page complete" -percentcomplete $pagepercent

    trap [Exception] {
    write-host
    write-error $("TRAPPED: " + $_.Exception.GetType().FullName);
    write-error $("TRAPPED: " + $_.Exception.Message);
    continue;
    }

    $webClient.DownloadFile($url, $saveFileName)
    }
    $link = $feed.feed.link | where { $_.rel.startsWith("next") } | select href
    if ($link -ne $null) {
    # if using a paged url with a $skiptoken like
    # http:// ... /Packages?$skiptoken='EnyimMemcached-log4net','2.7'
    # remember that you need to escape the $ in powershell with `
    return $link.href
    }
    return $null
    }
    # the NuGet feed uses a fwlink which redirects
    # using this to follow the redirect
    function GetPackageUrl {
    param ([string]$feedUrlBase)
    $resp = [xml]$webClient.DownloadString($feedUrlBase)
    return $resp.service.GetAttribute("xml:base")
    }
    # --- do the actual work ---
    # if dest dir doesn't exist, create it
    #if (!(Test-Path -path $destinationDirectory)) { New-Item $destinationDirectory -type directory }
    # set up feed URL
    $serviceBase = GetPackageUrl($feedUrlBase)
    $feedUrl = $serviceBase + "Packages"
    if($latest) {
    $feedUrl = $feedUrl + "?`$filter=IsLatestVersion eq true"
    if($top -ne $null) {
    $feedUrl = $feedUrl + "&`$orderby=DownloadCount desc&`$top=$top"
    }
    }
    while($feedUrl -ne $null) {
    $feedUrl = DownloadEntries $feedUrl
    }