Skip to content

Instantly share code, notes, and snippets.

@cjuroz
Last active March 26, 2019 12:47
Show Gist options
  • Save cjuroz/7bff0e0be1bd307cfabdedffd1622136 to your computer and use it in GitHub Desktop.
Save cjuroz/7bff0e0be1bd307cfabdedffd1622136 to your computer and use it in GitHub Desktop.
Chocolatey script to install Visual Studio 2017 from local NAS using offline installer. More info about how to create offline installer here: https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual-studio
## USAGE EXAMPLES
# installs CoreEditor (the IDE), ManagedDesktop (.NET framework applications), NetCoreTools (.NET core applications), NetWeb (ASP.NET) + active product using provided Product Key
# choco install visualstudio2017enterprise.pls -y --params "/Features:Microsoft.VisualStudio.Workload.CoreEditor,Microsoft.VisualStudio.Workload.ManagedDesktop,Microsoft.VisualStudio.Workload.NetCoreTools,Microsoft.VisualStudio.Workload.NetWeb /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"
# silent bare minimum installation with product key activation. The minimum installation contains only the Core Editor workload (Microsoft.VisualStudio.Workload.CoreEditor)
# choco install visualstudio2017enterprise.pls -y --params "/ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"
# silent bare minimum installation without product key activation
# choco install visualstudio2017enterprise.pls -y
# Parse input argument string into a hashtable
# Format: /InstallPath:path location /Features:Microsoft.VisualStudio.Workload.CoreEditor,Microsoft.VisualStudio.Workload.ManagedDesktop /ProductKey:AB-D1
function Parse-Parameters ($s)
{
$parameters = @{ }
if (!$s)
{
Write-Debug "No package parameters."
return $parameters
}
Write-Debug "Package parameters: $s"
$s = ' ' + $s
[String[]] $kvpPrefix = @(" /")
$kvpDelimiter = ':'
$kvps = $s.Split($kvpPrefix, [System.StringSplitOptions]::RemoveEmptyEntries)
foreach ($kvp in $kvps)
{
Write-Debug "Package parameter kvp: $kvp"
$delimiterIndex = $kvp.IndexOf($kvpDelimiter)
if (($delimiterIndex -le 0) -or ($delimiterIndex -ge ($kvp.Length - 1))) { continue }
$key = $kvp.Substring(0, $delimiterIndex).Trim().ToLower()
if ($key -eq '') { continue }
$value = $kvp.Substring($delimiterIndex + 1).Trim()
Write-Debug "Package parameter: key=$key, value=$value"
$parameters.Add($key, $value)
}
return $parameters
}
function Generate-Install-Arguments-String ($parameters)
{
$s = "--includeRecommended --quiet --norestart --wait"
$s += " --addProductLang en-US --add Microsoft.VisualStudio.Workload.CoreEditor"
# --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NetCoreTools --add Microsoft.VisualStudio.Workload.NetWeb
$features = $parameters['Features']
if ($features)
{
foreach ($f in $features.Split(','))
{
$s += " --add "
$s += $f.Trim()
}
}
$rpp = '& "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\StorePID.exe"'
$ip = $parameters['InstallPath']
if ($ip)
{
$s += " --installPath `"$ip`""
$rpp = "& `"$($ip.Trim('\'))" + "\Common7\IDE\StorePID.exe`""
}
$pk = $parameters['ProductKey']
if ($pk)
{
$s += " --productKey $pk"
$parameters.Add('RegisterProduct', "$rpp $pk 08860")
}
return $s
}
$vendor = "microsoft"
$product = "visualstudio"
$packageName = $env:chocolateyPackageName
$packageParameters = Parse-Parameters $env:chocolateyPackageParameters
$silentArgs = Generate-Install-Arguments-String $packageParameters
$uncPath = "\\SERVER\tools\microsoft\visualstudio\2017\mu_visual_studio_enterprise_2017_x86_x64_10049783"
$uncUser = "DOMAIN\user"
$uncPassword = "password"
$driveLetter = dir function:[d-z]: -n | ?{ !(test-path $_) } | random
NET USE $driveLetter /D 2>null
NET USE $driveLetter $uncPath /u:$uncUser $uncPassword
$packageArgs = @{
packageName = $packageName
fileType = 'exe'
file = "$driveLetter\mu_visual_studio_enterprise_2017_x86_x64_10049783.exe"
silentArgs = $silentArgs
validExitCodes= @(0, 3010)
}
Write-Debug "Arguments used for $packageName`: $silentArgs"
Install-ChocolateyInstallPackage @packageArgs
NET USE $driveLetter /D 2>null
$rp = $packageParameters['RegisterProduct']
if ($rp)
{
Write-Debug "Register product using command line ($rp)"
Invoke-Expression $rp
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment