I need a simple one-liner function to use in the ‘Repair’ phase for non-MSI installers that will automatically run through the ‘Uninstall’ then the ‘Install’ phases of the script.
It’s so messy to duplicate everything into the Repair phase, and is more error-prone when editing to make sure both sections are identical.
Maybe needs a " -Delay [seconds]" parameter to pause between the two phases if required.
I have yet to use the REPAIR section.
I do uninstall of previous versions in the PreInstall section.
To avoid repetition of code, you could define scriptblocks for install and uninstall, then invoke those in the install/uninstall/repair sections.
Exactly what I do.
For example:
#region INSTALLATION
# ________________
#┌─┤ INSTALLATION ► ├────────────────────────────────────┐
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
[ScriptBlock]$InstallScriptBlock = {
$installPhase = "Pre-Installation"
# < Commands >
#├───────────────────────────────────────────────────────┤
$installPhase = "Installation"
# < Commands >
#├───────────────────────────────────────────────────────┤
$installPhase = "Post-Installation"
# < Commands >
}
#└───────────────────────────────────────────────────────┘
#endregion
#region UNINSTALLATION
# __________________
#┌─┤ UNINSTALLATION ► ├──────────────────────────────────┐
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
[ScriptBlock]$UninstallScriptBlock = {
$installPhase = "Pre-Uninstallation"
# < Commands >
#├───────────────────────────────────────────────────────┤
$installPhase = "Uninstallation"
# < Commands >
#├───────────────────────────────────────────────────────┤
$installPhase = "Post-Uninstallation"
# < Commands >
}
#└───────────────────────────────────────────────────────┘
#endregion
#region REPAIR
# __________
#┌─┤ REPAIR ► ├──────────────────────────────────────────┐
# ‾‾‾‾‾‾‾‾‾‾
[ScriptBlock]$RepairScriptBlock = {
$installPhase = "Pre-Repair"
# < Commands >
#├───────────────────────────────────────────────────────┤
$installPhase = "Repair"
#▌Invokes the uninstallation commands
Invoke-Command -ScriptBlock $UninstallScriptBlock -NoNewScope
#▌Invokes the installation commands
Invoke-Command -ScriptBlock $InstallScriptBlock -NoNewScope
#├───────────────────────────────────────────────────────┤
$installPhase = "Post-Repair"
# < Comandos >
}
#└───────────────────────────────────────────────────────┘
#endregion
# ▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲
if ($deploymentType -ine "Uninstall" -and $deploymentType -ine "Repair") { Invoke-Command -ScriptBlock $InstallScriptBlock -NoNewScope }
elseif ($deploymentType -ieq "Uninstall") { Invoke-Command -ScriptBlock $UninstallScriptBlock -NoNewScope }
elseif ($deploymentType -ieq "Repair") { Invoke-Command -ScriptBlock $RepairScriptBlock -NoNewScope }
1 Like
This is probably the way to go I suppose, but it’s a bit of a re-write of the template. I’ll have to play with this a bit and see.
If DanGough and LFM8787 are both doing this, and I’m looking for similar functionality, it might be worth creating a function for. There’s probably DOZENS of us! DOZENS! 
So for SCCM “required” deployments, if you want to give the option for clients to run a repair, you just run the install again?
You do not need to give a [Repair] button to each Application.
For most situations, installing over top a broken installation will work.
If the re-installation over top fails, an uninstall (with reboot or without reboot) and re-install usually works.
The only time a [Repair] button is useful is:
1- You need the user to be the one who decides and initiate the repair
2a- the vendor package supports the Repair capability directly
or
2b- You have intimate knowledge that a install-over-top-bad will have negative consequences and you know how to avoid it using scripting.