diff --git a/src/chocolatey/infrastructure.app/templates/ChocolateyInstallTemplate.cs b/src/chocolatey/infrastructure.app/templates/ChocolateyInstallTemplate.cs index 45c9b6b524..79f8f12c2b 100644 --- a/src/chocolatey/infrastructure.app/templates/ChocolateyInstallTemplate.cs +++ b/src/chocolatey/infrastructure.app/templates/ChocolateyInstallTemplate.cs @@ -24,10 +24,10 @@ public class ChocolateyInstallTemplate $ErrorActionPreference = 'Stop'; # stop on all errors [[AutomaticPackageNotesInstaller]] -$packageName = '[[PackageName]]' # arbitrary name for the package, used in messages -$toolsDir = ""$(Split-Path -parent $MyInvocation.MyCommand.Definition)"" -$url = '[[Url]]' # download url -$url64 = '[[Url64]]' # 64bit URL here or remove - if installer is both, use $url +$packageName= '[[PackageName]]' # arbitrary name for the package, used in messages +$toolsDir = ""$(Split-Path -parent $MyInvocation.MyCommand.Definition)"" +$url = '[[Url]]' # download url +$url64 = '[[Url64]]' # 64bit URL here or remove - if installer is both, use $url $packageArgs = @{ packageName = $packageName @@ -40,11 +40,11 @@ public class ChocolateyInstallTemplate silentArgs = ""/qn /norestart /l*v `""$env:TEMP\chocolatey\$($packageName)\$($packageName).MsiInstall.log`"""" # ALLUSERS=1 DISABLEDESKTOPSHORTCUT=1 ADDDESKTOPICON=0 ADDSTARTMENU=0 validExitCodes= @(0, 3010, 1641) #OTHERS - #silentArgs ='[[SilentArgs]]' # ""/s /S /q /Q /quiet /silent /SILENT /VERYSILENT -s"" # try any of these to get the silent installer + #silentArgs ='[[SilentArgs]]' # /s /S /q /Q /quiet /silent /SILENT /VERYSILENT -s - try any of these to get the silent installer #validExitCodes= @(0) #please insert other valid exit codes here - # optional - registryUninstallerKey = '[[PackageName]]' #ensure this is the value in the registry + # optional, highly recommended + softwareName = '[[PackageName]]*' #part or all of the Display Name as you see it in Programs and Features. It should be enough to be unique checksum = '[[Checksum]]' checksumType = '[[ChecksumType]]' #default is md5, can also be sha1 checksum64 = '[[Checksum64]]' @@ -69,22 +69,31 @@ public class ChocolateyInstallTemplate #Install-ChocolateyVsixPackage @packageArgs # see the full list at https://github.com/chocolatey/choco/wiki/HelpersReference + # downloader that the main helpers use to download items # if removing $url64, please remove from here #Get-ChocolateyWebFile $packageName 'DOWNLOAD_TO_FILE_FULL_PATH' $url $url64 + # installer, will assert administrative rights - used by Install-ChocolateyPackage +# use this for embedding installers in the package when not going to community feed or when you have distribution rights #Install-ChocolateyInstallPackage $packageName $fileType $silentArgs '_FULLFILEPATH_' -validExitCodes $validExitCodes + # unzips a file to the specified location - auto overwrites existing content #Get-ChocolateyUnzip ""FULL_LOCATION_TO_ZIP.zip"" $toolsDir + # Runs processes asserting UAC, will assert administrative rights - used by Install-ChocolateyInstallPackage #Start-ChocolateyProcessAsAdmin 'STATEMENTS_TO_RUN' 'Optional_Application_If_Not_PowerShell' -validExitCodes $validExitCodes + # add specific folders to the path - any executables found in the chocolatey package folder will already be on the path. This is used in addition to that or for cases when a native installer doesn't add things to the path. #Install-ChocolateyPath 'LOCATION_TO_ADD_TO_PATH' 'User_OR_Machine' # Machine will assert administrative rights + # add specific files as shortcuts to the desktop #$target = Join-Path $toolsDir ""$($packageName).exe"" # Install-ChocolateyShortcut -shortcutFilePath """" -targetPath """" [-workDirectory ""C:\"" -arguments ""C:\test.txt"" -iconLocation ""C:\test.ico"" -description ""This is the description""] + # outputs the bitness of the OS (either ""32"" or ""64"") #$osBitness = Get-ProcessorBits + #Install-ChocolateyEnvironmentVariable -variableName ""SOMEVAR"" -variableValue ""value"" [-variableType = 'Machine' #Defaults to 'User'] #Install-ChocolateyFileAssociation diff --git a/src/chocolatey/infrastructure.app/templates/ChocolateyUninstallTemplate.cs b/src/chocolatey/infrastructure.app/templates/ChocolateyUninstallTemplate.cs index 1a9695f5d9..7693f633d3 100644 --- a/src/chocolatey/infrastructure.app/templates/ChocolateyUninstallTemplate.cs +++ b/src/chocolatey/infrastructure.app/templates/ChocolateyUninstallTemplate.cs @@ -20,59 +20,60 @@ public class ChocolateyUninstallTemplate public static string Template = @"#NOTE: Please remove any commented lines to tidy up prior to releasing the package, including this one # REMOVE ANYTHING BELOW THAT IS NOT NEEDED +# If this is an MSI, cleaning up comments is all you need. +# If this is an exe, change installerType and silentArgs # Auto Uninstaller should be able to detect and handle registry uninstalls (if it is turned on, it is in preview for 0.9.9). $ErrorActionPreference = 'Stop'; # stop on all errors $packageName = '[[PackageName]]' -# registry uninstaller key name is the key that is found at HKLM:\Software\Windows\CurrentVersion\Uninstall\ THE NAME -$registryUninstallerKeyName = '[[PackageName]]' #ensure this is the value in the registry -$msiProductCodeGuid = '{insert it here}' -$shouldUninstall = $true - -$local_key = ""HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName"" -# local key 6432 probably never exists -$local_key6432 = ""HKCU:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName"" -$machine_key = ""HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName"" -$machine_key6432 = ""HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$registryUninstallerKeyName"" - -$file = @($local_key, $local_key6432, $machine_key, $machine_key6432) ` - | ?{ Test-Path $_ } ` - | Get-ItemProperty ` - | Select-Object -ExpandProperty UninstallString +$softwareName = '[[PackageName]]*' #part or all of the Display Name as you see it in Programs and Features. It should be enough to be unique +$installerType = 'MSI' +#$installerType = 'EXE' -if ($file -eq $null -or $file -eq '') { - Write-Host ""$packageName has already been uninstalled by other means."" - $shouldUninstall = $false +$silentArgs = '/qn /norestart' +# https://msdn.microsoft.com/en-us/library/aa376931(v=vs.85).aspx +$validExitCodes = @(0, 3010, 1605, 1614, 1641) +if ($installerType -ne 'MSI') { + # The below is somewhat naive and built for EXE installers + $silentArgs = '/S' # /s /S /q /Q /quiet /silent /SILENT /VERYSILENT -s - try any of these to get the silent installer + $validExitCodes = @(0) } -# The below is somewhat naive and built for EXE installers -#$installerType = 'EXE' -#$silentArgs = '/S' -#$validExitCodes = @(0) +$uninstalled = $false -#if (!(Test-Path $file)) { -# Write-Host ""$packageName has already been uninstalled by other means."" -# $shouldUninstall = $false -#} +Get-ItemProperty -Path @($machine_key6432,$machine_key, $local_key) ` + -ErrorAction SilentlyContinue ` + | ? { $_.DisplayName -like ""$softwareName"" } ` + | Select -First 1 ` + | % { + $file = ""$($_.UninstallString)"" + + if ($installerType -eq 'MSI') { + # The Product Code GUID is all that should be passed for MSI, and very + # FIRST, because it comes directly after /x, which is already set in the + # Uninstall-ChocolateyPackage msiargs (facepalm). + $silentArgs = ""$($_.PSChildName) $silentArgs"" + + # Don't pass anything for file, it is ignored for msi (facepalm number 2) + # Alternatively if you need to pass a path to an msi, determine that and + # use it instead of the above in silentArgs, still very first + $file = '' + } -# The below is somewhat naive and built for MSI installers -$installerType = 'MSI' -# The Product Code GUID is all that should be passed for MSI, and very FIRST, -# because it comes directly after /x, which is already set in the -# Uninstall-ChocolateyPackage msiargs (facepalm). -$silentArgs = ""$msiProductCodeGuid /qn /norestart"" -# https://msdn.microsoft.com/en-us/library/aa376931(v=vs.85).aspx -$validExitCodes = @(0, 3010, 1605, 1614, 1641) -# Don't pass anything for file, it is ignored for msi (facepalm number 2) -# Alternatively if you need to pass a path to an msi, determine that and use -# it instead of $msiProductCodeGuid in silentArgs, still very first -$file = '' + Uninstall-ChocolateyPackage -PackageName $packageName ` + -FileType $installerType ` + -SilentArgs ""$silentArgs"" ` + -ValidExitCodes $validExitCodes ` + -File ""$file"" + $uninstalled = $true + } -if ($shouldUninstall) { - Uninstall-ChocolateyPackage -PackageName $packageName -FileType $installerType -SilentArgs $silentArgs -validExitCodes $validExitCodes -File $file +if (!($uninstalled)) { + Write-Warning ""$packageName has already been uninstalled by other means."" } + ## OTHER HELPERS ## https://github.com/chocolatey/choco/wiki/HelpersReference #Uninstall-ChocolateyZipPackage