param ( [string]$Version = $null ) Set-StrictMode -Version latest $ErrorActionPreference = "Stop" $ProgressPreference = "SilentlyContinue" # default installation directory $dmd_install = "C:\D" $dmd_version_file = "C:\cache\DMD_LATEST" if (!$Version) { #echo "Fetching latest DMD version..." $dmd_latest_url = "http://downloads.dlang.org/releases/LATEST" $retries = 10 for ($i = 1; $i -le $retries; $i++) { try { [system.io.directory]::CreateDirectory((Split-Path -parent $dmd_version_file)) > $null Invoke-WebRequest -URI $dmd_latest_url -OutFile $dmd_version_file break } catch [net.WebException] { if ($i -eq $retries) { break } $backoff = (10 * $i) # backoff 10s, 20s, 30s... echo ('{0}: {1}' -f $dmd_latest_url, $_.Exception.Message) echo ('Retrying in {0}s...' -f $backoff) Start-Sleep -m ($backoff * 1000) } catch { throw } } if (Test-Path $dmd_version_file) { $dmd_version = Get-Content -Path $dmd_version_file } else { throw "Failed to resolve latest DMD version" } } else { $dmd_version = $Version } $dmd_url = "http://downloads.dlang.org/releases/2.x/$dmd_version/dmd.$dmd_version.windows.zip" $dmd_filename = [System.IO.Path]::GetFileName($dmd_url) $dmd_archive = Join-Path ($env:temp) $dmd_filename #echo "Downloading $dmd_filename..." $retries = 10 for ($i = 1; $i -le $retries; $i++) { try { (New-Object net.webclient).DownloadFile($dmd_url, $dmd_archive) break } catch [net.WebException] { if ($i -eq $retries) { throw # fail on last retry } $backoff = (10 * $i) # backoff 10s, 20s, 30s... echo ('{0}: {1}' -f $dmd_url, $_.Exception.Message) echo ('Retrying in {0}s...' -f $backoff) Start-Sleep -m ($backoff * 1000) } } #echo "Extracting $dmd_filename..." Expand-Archive $dmd_archive -Force -DestinationPath $dmd_install # add to environment path #echo "Installing DMD..." $dmd_bin = Join-Path $dmd_install "dmd2\windows\bin" $Env:Path = $Env:Path + ";" + $dmd_bin #echo "Testing DMD..." & dmd.exe --version