1010  [switch ] $x64  =  $false , 
1111  [switch ] $svr50  =  $false , 
1212  [switch ] $svrc50  =  $false , 
13+   [alias (" a"  )]
14+   [string ] $alias  =  $null , 
1315  [parameter (Position = 1 ,  ValueFromRemainingArguments = $true )]
1416  [string []]$args = @ ()
1517)
@@ -18,12 +20,18 @@ $userKrePath = $env:USERPROFILE + "\.kre"
1820$userKrePackages  =  $userKrePath  +  " \packages" 
1921$globalKrePath  =  $env: ProgramFiles  +  " \KRE" 
2022$globalKrePackages  =  $globalKrePath  +  " \packages" 
23+ $feed  =  $env: KRE_NUGET_API_URL 
24+ 
25+ if  (! $feed )
26+ {
27+     $feed  =  " https://www.myget.org/F/aspnetvnext/api/v2"  ;
28+ }
2129
2230$scriptPath  =  $myInvocation.MyCommand.Definition  
2331
2432function  Kvm-Help  {
2533@" 
26- K Runtime Environment Version Manager - Build 538  
34+ K Runtime Environment Version Manager - Build 10002  
2735
2836USAGE: kvm <command> [options] 
2937
@@ -35,29 +43,34 @@ kvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] [-proxy <ADDRESS>]
3543  -f|-force         upgrade even if latest is already installed 
3644  -proxy <ADDRESS>  use given address as proxy when accessing remote server 
3745
38- kvm install <semver>|<alias>|<nupkg> [-x86][-x64] [-svr50][-svrc50] [-g|-global] 
39-   install requested KRE from feed 
46+ kvm install <semver>|<alias>|<nupkg>|latest [-x86][-x64] [-svr50][-svrc50] [-a|-alias <alias>] [-g|-global] [-f|-force] 
47+   <semver>|<alias>  install requested KRE from feed 
48+   <nupkg>           install requested KRE from package on local filesystem 
49+   latest            install latest KRE from feed 
4050  add KRE bin to path of current command line 
51+   -p|-persistent    add KRE bin to PATH environment variables persistently 
52+   -a|-alias <alias> set alias <alias> for requested KRE on install 
4153  -g|-global        install to machine-wide location 
4254  -f|-force         install even if specified version is already installed 
4355
4456kvm use <semver>|<alias>|none [-x86][-x64] [-svr50][-svrc50] [-p|-persistent] [-g|-global] 
45-   <semver>|<alias>  add KRE bin to path of current command line     
57+   <semver>|<alias>  add KRE bin to path of current command line 
4658  none              remove KRE bin from path of current command line 
4759  -p|-persistent    add KRE bin to PATH environment variables persistently 
4860  -g|-global        combined with -p to change machine PATH instead of user PATH 
4961
5062kvm list 
51-   list KRE versions installed   
63+   list KRE versions installed 
5264
5365kvm alias 
5466  list KRE aliases which have been defined 
5567
5668kvm alias <alias> 
5769  display value of named alias 
5870
59- kvm alias <alias> <semver> [-x86][-x64] [-svr50][-svrc50] 
60-   set alias to specific version 
71+ kvm alias <alias> <semver>|<alias> [-x86][-x64] [-svr50][-svrc50] 
72+   <alias>            The name of the alias to set 
73+   <semver>|<alias>   The KRE version to set the alias to. Alternatively use the version of the specified alias 
6174
6275"@   |  Write-Host 
6376}
@@ -109,21 +122,19 @@ function Kvm-Global-Setup {
109122
110123function  Kvm-Global-Upgrade  {
111124    $persistent  =  $true 
125+     $alias = " default" 
112126    If  (Needs- Elevation) {
113127        $arguments  =  " & '$scriptPath ' upgrade -global $ ( Requested- Switches) " 
114128        Start-Process  " $psHome \powershell.exe"   - Verb runAs - ArgumentList $arguments  - Wait
115129        break 
116130    }
117-     $version  =  Kvm- Find-Latest  (Requested- Platform " svr50"  ) (Requested- Architecture " x86"  )
118-     Kvm- Global- Install $version 
119-     Kvm- Alias- Set " default"   $version 
131+     Kvm- Global- Install " latest" 
120132}
121133
122134function  Kvm-Upgrade  {
123135    $persistent  =  $true 
124-     $version  =  Kvm- Find-Latest  (Requested- Platform " svr50"  ) (Requested- Architecture " x86"  )
125-     Kvm- Install $version 
126-     Kvm- Alias- Set " default"   $version 
136+     $alias = " default" 
137+     Kvm- Install " latest" 
127138}
128139
129140function  Add-Proxy-If-Specified  {
@@ -152,30 +163,26 @@ param(
152163)
153164    Write-Host  " Determining latest version" 
154165
155-     $url  =  " https://www.myget.org/F/aspnetvnext/api/v2 /GetUpdates()?packageIds=%27KRE-$platform -$architecture %27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" 
166+     $url  =  " $feed /GetUpdates()?packageIds=%27KRE-$platform -$architecture %27&versions=%270.0%27&includePrerelease=true&includeAllVersions=false" 
156167
157168    $wc  =  New-Object  System.Net.WebClient
158169    $wc.Credentials   =  new-object  System.Net.NetworkCredential(" aspnetreadonly" ,  " 4d8a2d9c-7b80-4162-9978-47e918c9658c"  )
159170    Add-Proxy - If- Specified($wc )
160171    [xml ]$xml  =  $wc.DownloadString  ($url )
161172
162-     $version  =  Select-Xml  " //d:Version"   - Namespace @ {d = ' http://schemas.microsoft.com/ado/2007/08/dataservices'  } $xml   
173+     $version  =  Select-Xml  " //d:Version"   - Namespace @ {d = ' http://schemas.microsoft.com/ado/2007/08/dataservices'  } $xml 
163174
164175    return  $version 
165176}
166177
167- function  Kvm-Install-Latest  {
168-     Kvm- Install (Kvm- Find-Latest  (Requested- Platform " svr50"  ) (Requested- Architecture " x86"  ))
169- }
170- 
171178function  Do-Kvm-Download  {
172179param (
173180  [string ] $kreFullName , 
174181  [string ] $packagesFolder 
175182)
176183    $parts  =  $kreFullName.Split  (" ." ,  2 )
177184
178-     $url  =  " https://www.myget.org/F/aspnetvnext/api/v2 /package/"   +  $parts [0 ] +  " /"   +  $parts [1 ]
185+     $url  =  " $feed /package/"   +  $parts [0 ] +  " /"   +  $parts [1 ]
179186    $kreFolder  =  Join-Path  $packagesFolder  $kreFullName 
180187    $kreFile  =  Join-Path  $kreFolder  " $kreFullName .nupkg" 
181188
@@ -189,13 +196,13 @@ param(
189196      }
190197    }
191198
192-     Write-Host  " Downloading"   $kreFullName  " from https://www.myget.org/F/aspnetvnext/api/v2/ " 
199+     Write-Host  " Downloading"   $kreFullName  " from $feed " 
193200
194201    # Downloading to temp location
195202    $kreTempDownload  =  Join-Path  $packagesFolder  " temp" 
196203    $tempKreFile  =  Join-Path  $kreTempDownload  " $kreFullName .nupkg" 
197204
198-     if (Test-Path  $kreTempDownload ) {   
205+     if (Test-Path  $kreTempDownload ) {
199206      del " $kreTempDownload \*"   - recurse
200207    } else  {
201208      md $kreTempDownload  - Force |  Out-Null 
@@ -208,7 +215,7 @@ param(
208215
209216    Do - Kvm- Unpack $tempKreFile  $kreTempDownload 
210217
211-     md $kreFolder  - Force |  Out-Null     
218+     md $kreFolder  - Force |  Out-Null 
212219    Write-Host  " Installing to $kreFolder " 
213220    mv " $kreTempDownload \*"   $kreFolder 
214221}
@@ -233,7 +240,7 @@ param(
233240      # make it a nupkg again
234241      Rename-Item  $kreZip  $kreFile 
235242    }
236-      
243+ 
237244    If  (Test-Path  ($kreFolder  +  " \[Content_Types].xml"  )) {
238245        Remove-Item  ($kreFolder  +  " \[Content_Types].xml"  )
239246    }
@@ -256,10 +263,17 @@ param(
256263        break 
257264    }
258265
266+     if  ($versionOrAlias  -eq  " latest"  ) {
267+         $versionOrAlias  =  Kvm- Find-Latest  (Requested- Platform " svr50"  ) (Requested- Architecture " x86"  )
268+     }
269+ 
259270    $kreFullName  =  Requested- VersionOrAlias $versionOrAlias 
260271
261272    Do - Kvm- Download $kreFullName  $globalKrePackages 
262273    Kvm- Use $versionOrAlias 
274+     if  (! [string ]::IsNullOrWhiteSpace($alias )) {
275+         Kvm- Alias- Set $alias  $versionOrAlias 
276+     }
263277}
264278
265279function  Kvm-Install  {
@@ -276,36 +290,44 @@ param(
276290            del $kreFolder  - Recurse - Force
277291            $folderExists  =  $false ;
278292        }
279-          
293+ 
280294        if ($folderExists ) {
281295            Write-Host  " Target folder '$kreFolder ' already exists" 
282296        } else  {
283297            $tempUnpackFolder  =  Join-Path  $userKrePackages  " temp" 
284298            $tempKreFile  =  Join-Path  $tempUnpackFolder  " $kreFullName .nupkg" 
285-          
286-             if (Test-Path  $tempUnpackFolder ) {   
299+ 
300+             if (Test-Path  $tempUnpackFolder ) {
287301                del " $tempUnpackFolder \*"   - recurse
288302            } else  {
289303                md $tempUnpackFolder  - Force |  Out-Null 
290304            }
291305            copy $versionOrAlias  $tempKreFile 
292-                          
306+ 
293307            Do - Kvm- Unpack $tempKreFile  $tempUnpackFolder 
294308            md $kreFolder  - Force |  Out-Null 
295309            Write-Host  " Installing to $kreFolder " 
296310            mv " $tempUnpackFolder \*"   $kreFolder 
297311        }
298312
299-         $kreBin  =  " $kreFolder \bin" 
300-         Write-Host  " Adding"   $kreBin  " to process PATH" 
301-         Set-Path  (Change- Path $env: Path  $kreBin  ($globalKrePackages ,  $userKrePackages ))
302-     }
303-     else 
304-     {
305-         $kreFullName  =  Requested- VersionOrAlias $versionOrAlias 
313+         $packageVersion  =  Package- Version $kreFullName 
314+         Kvm- Use $packageVersion 
315+         if  (! [string ]::IsNullOrWhiteSpace($alias )) {
316+             Kvm- Alias- Set $alias  $packageVersion 
317+         }
318+     }
319+     else 
320+     {
321+         if  ($versionOrAlias  -eq  " latest"  ) {
322+             $versionOrAlias  =  Kvm- Find-Latest  (Requested- Platform " svr50"  ) (Requested- Architecture " x86"  )
323+         }
324+         $kreFullName  =  Requested- VersionOrAlias $versionOrAlias 
306325
307326        Do - Kvm- Download $kreFullName  $userKrePackages 
308327        Kvm- Use $versionOrAlias 
328+         if  (! [string ]::IsNullOrWhiteSpace($alias )) {
329+             Kvm- Alias- Set $alias  $versionOrAlias 
330+         }
309331    }
310332}
311333
@@ -325,7 +347,7 @@ function Kvm-List {
325347}
326348
327349filter  List-Parts  {
328-   $hasBin  =  Test-Path ($_.FullName  + " \bin"  )  
350+   $hasBin  =  Test-Path ($_.FullName  + " \bin"  )
329351  if  (! $hasBin ) {
330352    return 
331353  }
@@ -363,7 +385,7 @@ param(
363385      Write-Host  " Removing KRE from process PATH" 
364386      Set-Path  (Change- Path $env: Path  " "   ($globalKrePackages ,  $userKrePackages ))
365387
366-       if  ($persistent ) {   
388+       if  ($persistent ) {
367389          Write-Host  " Removing KRE from machine PATH" 
368390          $machinePath  =  [Environment ]::GetEnvironmentVariable(" Path" ,  [System.EnvironmentVariableTarget ]::Machine)
369391          $machinePath  =  Change- Path $machinePath  " "   ($globalKrePackages ,  $userKrePackages )
@@ -378,7 +400,7 @@ param(
378400    if  ($kreBin  -eq  $null ) {
379401      Write-Host  " Cannot find $kreFullName , do you need to run 'kvm install $versionOrAlias '?" 
380402      return 
381-     }  
403+     }
382404
383405    Write-Host  " Adding"   $kreBin  " to process PATH" 
384406    Set-Path  (Change- Path $env: Path  $kreBin  ($globalKrePackages ,  $userKrePackages ))
@@ -399,7 +421,7 @@ param(
399421      Write-Host  " Removing KRE from process PATH" 
400422      Set-Path  (Change- Path $env: Path  " "   ($globalKrePackages ,  $userKrePackages ))
401423
402-       if  ($persistent ) {   
424+       if  ($persistent ) {
403425          Write-Host  " Removing KRE from user PATH" 
404426          $userPath  =  [Environment ]::GetEnvironmentVariable(" Path" ,  [System.EnvironmentVariableTarget ]::User)
405427          $userPath  =  Change- Path $userPath  " "   ($globalKrePackages ,  $userKrePackages )
@@ -414,12 +436,12 @@ param(
414436    if  ($kreBin  -eq  $null ) {
415437      Write-Host  " Cannot find $kreFullName , do you need to run 'kvm install $versionOrAlias '?" 
416438      return 
417-     }  
439+     }
418440
419441    Write-Host  " Adding"   $kreBin  " to process PATH" 
420442    Set-Path  (Change- Path $env: Path  $kreBin  ($globalKrePackages ,  $userKrePackages ))
421443
422-     if  ($persistent ) {   
444+     if  ($persistent ) {
423445        Write-Host  " Adding $kreBin  to user PATH" 
424446        $userPath  =  [Environment ]::GetEnvironmentVariable(" Path" ,  [System.EnvironmentVariableTarget ]::User)
425447        $userPath  =  Change- Path $userPath  $kreBin  ($globalKrePackages ,  $userKrePackages )
@@ -438,15 +460,20 @@ param(
438460  [string ] $name 
439461)
440462    md ($userKrePath  +  " \alias\"  ) - Force |  Out-Null 
441-     Write-Host  " Alias '$name ' is set to"   (Get-Content  ($userKrePath  +  " \alias\"   +  $name  +  " .txt"  ))
463+     $aliasFilePath = $userKrePath  +  " \alias\"   +  $name  +  " .txt" 
464+     if  (! (Test-Path  $aliasFilePath )) {
465+         Write-Host  " Alias '$name ' does not exist" 
466+     } else  {
467+         Write-Host  " Alias '$name ' is set to"   (Get-Content  ($userKrePath  +  " \alias\"   +  $name  +  " .txt"  ))
468+     }
442469}
443470
444471function  Kvm-Alias-Set  {
445472param (
446473  [string ] $name , 
447474  [string ] $value 
448475)
449-     $kreFullName  =  " KRE- "   +  ( Requested- Platform  " svr50 " )  +   " - "   +  (Requested - Architecture  " x86 " )  +   " . "   +  $value 
476+     $kreFullName  =  Requested- VersionOrAlias  $value 
450477
451478    Write-Host  " Setting alias '$name ' to '$kreFullName '" 
452479    md ($userKrePath  +  " \alias\"  ) - Force |  Out-Null 
@@ -471,6 +498,13 @@ param(
471498  return  $null 
472499}
473500
501+ function  Package-Version () {
502+ param (
503+   [string ] $kreFullName 
504+ )
505+     return  $kreFullName  -replace  ' [^.]*.(.*)' ,  ' $1' 
506+ }
507+ 
474508function  Requested-VersionOrAlias () {
475509param (
476510  [string ] $versionOrAlias 
@@ -496,7 +530,7 @@ param(
496530)
497531    if  ($svr50  -and  $svrc50 ) {
498532        Throw  " This command cannot accept both -svr50 and -svrc50" 
499-     }  
533+     }
500534    if  ($svr50 ) {
501535        return  " svr50" 
502536    }
@@ -512,7 +546,7 @@ param(
512546)
513547    if  ($x86  -and  $x64 ) {
514548        Throw  " This command cannot accept both -x86 and -x64" 
515-     }  
549+     }
516550    if  ($x86 ) {
517551        return  " x86" 
518552    }
@@ -534,7 +568,7 @@ param(
534568      foreach ($removePath  in  $removePaths ) {
535569        if  ($portion.StartsWith  ($removePath )) {
536570          $skip  =  $true 
537-         }       
571+         }
538572      }
539573      if  (! $skip ) {
540574        $newPath  =  $newPath  +  " ;"   +  $portion 
@@ -574,7 +608,6 @@ function Requested-Switches() {
574608    switch  - wildcard ($command  +  "  "   +  $args.Count  ) {
575609      " setup 0"             {Kvm- Global- Setup}
576610      " upgrade 0"           {Kvm- Global- Upgrade}
577- #       "install 0"         {Kvm-Global-Install-Latest}
578611      " install 1"           {Kvm- Global- Install $args [0 ]}
579612#       "list 0"            {Kvm-Global-List}
580613      " use 1"               {Kvm- Global- Use $args [0 ]}
@@ -584,7 +617,6 @@ function Requested-Switches() {
584617    switch  - wildcard ($command  +  "  "   +  $args.Count  ) {
585618      " setup 0"             {Kvm- Global- Setup}
586619      " upgrade 0"           {Kvm- Upgrade}
587- #       "install 0"         {Kvm-Install-Latest}
588620      " install 1"           {Kvm- Install $args [0 ]}
589621      " list 0"              {Kvm- List}
590622      " use 1"               {Kvm- Use $args [0 ]}
0 commit comments