Uninstall ALL MS Visio versions (and MS Project in comments)

This script will check wheter any version of MS Visio is installed and uninstall it.
It doesn’t require any Setup or source files as it will check the Uninstall string and use that one to uninstall.
For unattended silent uninstalls, an XML file will be created in the Temp folder depending on the installed version of Visio and will be used for the uninstall.

I have tested this script with following installed products and it worked every time without any issues:
Microsoft Office Visio Standard 2003
Microsoft Office Visio Professional 2003
Microsoft Office Visio Standard 2007
Microsoft Office Visio Professional 2007
Microsoft Visio Standard 2010
Microsoft Visio Professional 2010
Microsoft Visio Premium 2010
Microsoft Visio Standard 2013
Microsoft Visio Professional 2013
Microsoft Visio Standard 2016
Microsoft Visio Professional 2016

I will not post the script here because this forum will screw with the formatting;
You can find the script here:
https://drive.google.com/file/d/0B1RmM7netsG3U0pfQmszSFVIOXc/view?usp=sharing


For your reference, the Product ID’s for the different Visio versions that have to be used in the XML are:
VisPro
Visio Professional 2007
Visio Professional 2013
Visio Professional 2016

VisStd
Visio Standard 2007
Visio Standard 2013
Visio Standard 2016

Visio
All Visio 2010

Perfect, you’re a lifesaver;)

How do I change the script to use it foor Project? I changed all the visio and vis text into project and proj but it doesn’t work… Powershell windows stops…

And how do I implement the script to do this for 200 computers?

Well I actually happen to have an uninstall script for all Ms Project versions from 2003 until 2013.
We didn’t have 2016 back then, but it shouldn’t be that hard to append to the script.

I’ve successfully uninstalled approx. 350 Microsoft Projects.
For your information, there are other ways to accomplish this as well. Like for instance using the Offscrub.vbs files (which I use for my Office upgrades).
But I seriously had a 100% success rate with my script which basically does a clean uninstall like you would do manually.

To answer your question…
Project 2003 and Project 2007 (all versions) have a Product Code that can be used with msiexec to uninstall it.
So what I did is get the Product Code like this:

$ProjPro2003 = (Get-InstalledApplication -Name "Microsoft Office Project Professional 2003").ProductCode
$ProjStd2003 = (Get-InstalledApplication -Name "Microsoft Office Project Standard 2003").ProductCode
$ProjPro2007 = (Get-InstalledApplication -Name "Microsoft Office Project Professional 2007").ProductCode
$ProjStd2007 = (Get-InstalledApplication -Name "Microsoft Office Project Standard 2007").ProductCode

Then with some if statements (if installed) uninstalled it with:
Execute-MSI -Action 'Uninstall' -Path $ProductKey

For Project 2010 and Project 2013 I userd the XML files like for Visio.
Procuct Code for Microsoft Project Standard 2010 and 2013: ProjStd
Procuct Code for Microsoft Project Professional 2010 and 2013: ProjPro

If you can’t figure it out i can share my script.
I hate doing it on this forum because it messes the script up.

We have this version:
IdentifyingNumber : {90150000-003B-0000-0000-0000000FF1CE}
Name : Microsoft Project Professional 2013
Vendor : Microsoft Corporation
Version : 15.0.4569.1506
Caption : Microsoft Project Professional 2013

From registry:
MsiExec.exe /X{90150000-003B-0000-0000-0000000FF1CE}

Changed the script.
$PrjPro2013 = Get-InstalledApplication -Name “Microsoft Project Professional 2013” -Exact | where {$_.UninstallSubkey -eq “Office15.ProjPRO”}

It starts and finds Project, no .xml creation…

Last results:
[12-21-2016 08:25:19.465] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Professional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].
[12-21-2016 08:25:19.490] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Professional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].
[12-21-2016 08:25:19.549] [Post-Uninstallation] [Exit-Script] :: Microsoft Project Uninstall Uninstallation completed with exit code [0].
[12-21-2016 08:25:19.553] [Post-Uninstallation] [Exit-Script] :: ------------------------------------------------------------------

Yeah that should work as well I guess.
Best practice is still using setup.exe and the config.xml files
https://technet.microsoft.com/nl-nl/library/cc178956.aspx#BKMK_uninstall

Here is the complete script…
As I’ve said. I had a 100% success rate. I’ve uninstalled Project on all targeted machines.


<#
.SYNOPSIS
	This script performs the installation or uninstallation of an application(s).
.DESCRIPTION
	The script is provided as a template to perform an install or uninstall of an application(s).
	The script either performs an "Install" deployment type or an "Uninstall" deployment type.
	The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install.
	The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application.
.PARAMETER DeploymentType
	The type of deployment to perform. Default is: Install.
.PARAMETER DeployMode
	Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive.
.PARAMETER AllowRebootPassThru
	Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered.
.PARAMETER TerminalServerMode
	Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers.
.PARAMETER DisableLogging
	Disables logging to file for the script. Default is: $false.
.EXAMPLE
    powershell.exe -Command "&amp; { &amp; '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }"
.EXAMPLE
    powershell.exe -Command "&amp; { &amp; '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }"
.EXAMPLE
    powershell.exe -Command "&amp; { &amp; '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }"
.EXAMPLE
    Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent"
.NOTES
	Toolkit Exit Code Ranges:
	60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1
	69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1
	70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1
.LINK 
	http://psappdeploytoolkit.com
#>
[CmdletBinding()]
Param (
	[Parameter(Mandatory=$false)]
	[ValidateSet('Install','Uninstall')]
	[string]$DeploymentType = 'Install',
	[Parameter(Mandatory=$false)]
	[ValidateSet('Interactive','Silent','NonInteractive')]
	[string]$DeployMode = 'Interactive',
	[Parameter(Mandatory=$false)]
	[switch]$AllowRebootPassThru = $false,
	[Parameter(Mandatory=$false)]
	[switch]$TerminalServerMode = $false,
	[Parameter(Mandatory=$false)]
	[switch]$DisableLogging = $false
)

Try {
	## Set the script execution policy for this process
	Try { Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' } Catch {}
	
	##*===============================================
	##* VARIABLE DECLARATION
	##*===============================================
	## Variables: Application
	[string]$appVendor = 'Microsoft'
	[string]$appName = 'Project'
	[string]$appVersion = '[ALL]'
	[string]$appArch = ''
	[string]$appLang = 'EN'
	[string]$appRevision = '01'
	[string]$appScriptVersion = '1.0.0'
	[string]$appScriptDate = '30/05/2016'
	[string]$appScriptAuthor = 'Aldin T.'
	##*===============================================
	## Variables: Install Titles (Only set here to override defaults set by the toolkit)
	[string]$installName = 'Microsoft Project Uninstall'
	[string]$installTitle = 'Microsoft Project Uninstall'
	
	##* Do not modify section below
	#region DoNotModify
	
	## Variables: Exit Code
	[int32]$mainExitCode = 0
	
	## Variables: Script
	[string]$deployAppScriptFriendlyName = 'Deploy Application'
	[version]$deployAppScriptVersion = [version]'3.6.8'
	[string]$deployAppScriptDate = '02/06/2016'
	[hashtable]$deployAppScriptParameters = $psBoundParameters
	
	## Variables: Environment
	If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation }
	[string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent
	
	## Dot source the required App Deploy Toolkit Functions
	Try {
		[string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1"
		If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." }
		If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain }
	}
	Catch {
		If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 }
		Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: <code>n$($_.Exception.Message)</code>n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue'
		## Exit the script, returning the exit code to SCCM
		If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode }
	}
	
	#endregion
	##* Do not modify section above
	##*===============================================
	##* END VARIABLE DECLARATION
	##*===============================================
		
	If ($deploymentType -ine 'Uninstall') {
		##*===============================================
		##* PRE-INSTALLATION
		##*===============================================
		[string]$installPhase = 'Pre-Installation'
	
		
		## Show Progress Message (with the default message)
		Show-InstallationProgress
		
		
		##*===============================================
		##* INSTALLATION 
		##*===============================================
		[string]$installPhase = 'Installation'
		
		## Handle Zero-Config MSI Installations
		If ($useDefaultMsi) {
			[hashtable]$ExecuteDefaultMSISplat =  @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) }
			Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } }
		}
		
		
		##*===============================================
		##* POST-INSTALLATION
		##*===============================================
		[string]$installPhase = 'Post-Installation'
		
		
		## Display a message at the end of the install
		If (-not $useDefaultMsi) { Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait }
	}
	ElseIf ($deploymentType -ieq 'Uninstall')
	{
		##*===============================================
		##* PRE-UNINSTALLATION
		##*===============================================
		[string]$installPhase = 'Pre-Uninstallation'
		
		## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing
		Show-InstallationWelcome -CloseApps 'WINPROJ' -Silent
		
        #Check installed version
        $ProjPro2003 = (Get-InstalledApplication -Name "Microsoft Office Project Professional 2003").ProductCode
        $ProjStd2003 = (Get-InstalledApplication -Name "Microsoft Office Project Standard 2003").ProductCode
        $ProjPro2007 = (Get-InstalledApplication -Name "Microsoft Office Project Professional 2007").ProductCode
        $ProjStd2007 = (Get-InstalledApplication -Name "Microsoft Office Project Standard 2007").ProductCode

        $ProjStd2010 = Get-InstalledApplication -Name "Microsoft Project Standard 2010" -Exact
        $ProjPro2010 = Get-InstalledApplication -Name "Microsoft Project Professional 2010" -Exact
        $ProjStd2013 = Get-InstalledApplication -Name "Microsoft Project Standard 2013" -Exact
        $ProjPro2013 = Get-InstalledApplication -Name "Microsoft Project Professional 2013" -Exact

        #Create XML file depending on installed version
        If ($ProjStd2013 -or $ProjStd2010) {

        #Create XML file for Project Standard:
        New-Item -Path "$env:TEMP\" -Name ProjSilentUninstallConfig.xml -ItemType "file" -Force -Value `
'&lt;Configuration Product="PrjStd"&gt;
    &lt;Logging Type="standard" Path="C:\LogFiles" Template="Microsoft Office Project Uninstal.txt" /&gt;
    &lt;Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" /&gt;
    &lt;Setting Id="SETUP_REBOOT" Value="NEVER" /&gt;
&lt;/Configuration&gt;
'
        }

        If ($ProjPro2013 -or $ProjPro2010) {

        #Create XML file for Project Professional:
        New-Item -Path "$env:TEMP\" -Name ProjSilentUninstallConfig.xml -ItemType "file" -Force -Value `
'&lt;Configuration Product="PrjPro"&gt;
    &lt;Logging Type="standard" Path="C:\LogFiles" Template="Microsoft Office Project Uninstal.txt" /&gt;
    &lt;Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" /&gt;
    &lt;Setting Id="SETUP_REBOOT" Value="NEVER" /&gt;
&lt;/Configuration&gt;
'
        }

    $ConfigXML = '"' + "$env:TEMP" + "\ProjSilentUninstallConfig.xml" + '"'

		##*===============================================
		##* UNINSTALLATION
		##*===============================================
		[string]$installPhase = 'Uninstallation'
		
		## Handle Zero-Config MSI Uninstallations
		If ($useDefaultMsi) {
			[hashtable]$ExecuteDefaultMSISplat =  @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) }
			Execute-MSI @ExecuteDefaultMSISplat
		}

        #Project 2003
        If ($ProjPro2003){
            $PrKey = $ProjPro2003.trim()
            Execute-MSI -Action 'Uninstall' -Path $PrKey
            }
        If ($ProjStd2003){
            $PrKey = $ProjStd2003.trim()
            Execute-MSI -Action 'Uninstall' -Path $PrKey
            }

        #Project 2007
        If ($ProjPro2007){
            $PrKey = $ProjPro2007.trim()
            Execute-MSI -Action 'Uninstall' -Path $PrKey
            }
        If ($ProjStd2007){
            $PrKey = $ProjStd2007.trim()
            Execute-MSI -Action 'Uninstall' -Path $PrKey
            }

        #Project 2010
		If ($ProjStd2010 -ne $Null){
            $TestSetupPath = Test-Path -Path "C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe"
            If ($TestSetupPath -eq $True) {
                Execute-Process -Path 'C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjStd /config $ConfigXML"
            } else {
                Execute-Process -Path 'C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjStd /config $ConfigXML"
            }
        }

		If ($ProjPro2010 -ne $Null){
            $TestSetupPath = Test-Path -Path "C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe"
            If ($TestSetupPath -eq $True) {
                Execute-Process -Path 'C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjPro /config $ConfigXML"
            } else {
                Execute-Process -Path 'C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjPro /config $ConfigXML"
            }
        }

        #Project 2013
		If ($ProjStd2013 -ne $Null){
            $TestSetupPath = Test-Path -Path "C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe"
            If ($TestSetupPath -eq $True) {
                Execute-Process -Path 'C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjStd /config $ConfigXML"
            } else {
                Execute-Process -Path 'C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjStd /config $ConfigXML"
            }
        }

		If ($ProjPro2013 -ne $Null){
            $TestSetupPath = Test-Path -Path "C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe"
            If ($TestSetupPath -eq $True) {
                Execute-Process -Path 'C:\Program Files\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjPro /config $ConfigXML"
            } else {
                Execute-Process -Path 'C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\Office Setup Controller\setup.exe' -Parameters "/uninstall PrjPro /config $ConfigXML"
            }
        }

		##*===============================================
		##* POST-UNINSTALLATION
		##*===============================================
		[string]$installPhase = 'Post-Uninstallation'
		
        #cleanup temp files for good housekeeping
		Remove-File -Path $ConfigXML
	}
	
	##*===============================================
	##* END SCRIPT BODY
	##*===============================================
	
	## Call the Exit-Script function to perform final cleanup operations
	Exit-Script -ExitCode $mainExitCode
}
Catch {
	[int32]$mainExitCode = 60001
	[string]$mainErrorMessage = "$(Resolve-Error)"
	Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName
	Show-DialogBox -Text $mainErrorMessage -Icon 'Stop'
	Exit-Script -ExitCode $mainExitCode
}
1 Like

Runned the script.
It went a little further than mine.
.XML file is created
.LOG is created

[12-21-2016 12:47:20.126] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Profess
ional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].
[12-21-2016 12:47:20.141] [Pre-Uninstallation] [Get-InstalledApplication] :: Found installed application [Microsoft Project Profess
ional 2013] version [15.0.4569.1506] using exact name matching for search term [Microsoft Project Professional 2013].

Directory: C:\Users\adminuser\AppData\Local\Temp

Mode LastWriteTime Length Name


-a---- 21-12-2016 12:47 323 ProjSilentUninstallConfig.xml
[12-21-2016 12:47:20.242] [Uninstallation] [Execute-Process] :: [C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\Offi
ce Setup Controller\setup.exe] is a valid fully qualified path, continue.
[12-21-2016 12:47:20.312] [Uninstallation] [Execute-Process] :: Working Directory is [C:\Program Files (x86)\Common Files\Microsoft
Shared\OFFICE15\Office Setup Controller].
[12-21-2016 12:47:20.317] [Uninstallation] [Execute-Process] :: Executing [C:\Program Files (x86)\Common Files\Microsoft Shared\OFF
ICE15\Office Setup Controller\setup.exe /uninstall PrjPro /config ”C:\Users\adminuser\AppData\Local\Temp\ProjSilentUninstallConfig.x
ml”]…

Setup.exe is started on remote PC. Than it hangs on something…

This doesn’t seem to be working for visio 2016 … the log file shows it as uninstalled, but it isn’t actually uninstalling. Am I missing something?

Strange.
I remember testing it with “Microsoft Visio Standard 2016” and “Microsoft Visio Professional 2016” back then.
It worked without problems.

Does it work when you run the uninstall string from CMD manually?

I suggest you do the following to troubleshoot:
In Powershell ISE Open
\AppDeployToolkit\AppDeployToolkitMain.ps1
Deploy-Application.ps1

Run AppDeployToolkitMain.ps1 from within ISE in order to load all functions, like it would if deployed via SCCM.
That way you can use all the cmdlets and functions from the toolkit.

I typed a lot more steps but this freaking forum doesn’t let me post it. It says it’s forbidden.
Probably because I included some cmdlets

Hi Aldin, I’m having some problems recreating the Project uninstaller is there any way you can share it like you did the Visio, cause I’m getting that it access the config.xml file and I’ve changed locations and still doesn’t help. Also, having some issues with the Visio for 2016 it works for 2013 but get Error Record: Message: You cannot call a method on a null-valued expression.
InnerException:
FullyQualifiedErrorId: InvokeMethodOnNull
PositionMessage: At C:\Windows\ccmcache\g\Deploy-Application.ps1:305
char:75

  • $params+((VisPro2016.UninstallString -split (""))[2]).trim <<<< 0 + " /config $ConfigXML_Pro"

Any help would be greatly appreciative.

Here is the link for MS Projct: https://drive.google.com/open?id=1u0hXcYepvD6qxcazyDkJ3CBj7iU4yWmL
It’s only until Project 2013 as we didn’t have 2016 back then.

As for that error you’re getting for Visio.
The error basically means: You are trying to do something (method) with a value, but the value doesn’t exist.
The method in that error is .trim
Basically, this part is blank, so you can’t trim it: (VisPro2016.UninstallString -split (“”))

did you change line 305?
It should be this:
$params = (($VisPro2016.UninstallString -split ('"'))[2]).trim() + " /config $ConfigXML_Pro"

In order to troubleshoot this, do the following:

  1. Open Powershell ISE as admin
  2. Open file: \AppDeployToolkit\AppDeployToolkitMain.ps1
  3. Run that file. This will load all functions from PsADT
  4. Open Deploy-Application.ps1 and troubleshot step by step

In your case, execute line 175, which is this:
$VisPro2016 = Get-InstalledApplication -Name "Microsoft Visio Professional 2016" -Exact | where {$_.UninstallSubkey -eq "Office16.VISPRO"}

See if that returns any value because this is where it goes wrong.

Thank you, I will start working on this and let you know how it turns out.

Hello, I tried to use this same script, changing it to Office Standard 2013, but presented the error below:

<code>---------------------------
Setup Error

Can not find the specified config.xml file. C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ Office Setup \ Controller \ &quot;C: \ windows \ Logs \ Software \ OfficeSilentUninstallConfig.xml&quot;

OK
---------------------------</code>

In my case, I need to verify that the machine is running Office x86 or x64 first and uninstall Lync 2013 and also Office 2010 if it is x64. How can I do it?

My changed script: https://drive.google.com/file/d/1-Kxd9TAMBFce7UA-Hl1T4tfRdWwVv_Ep/view?usp=sharing

Any chance you messed up the quotes?
I see weird quotes in your script when I open it.
some are straight quotes while others are curved quotes.
Make them all straight.

Use find-and-replace

Hi,

The viso and project i need to uninstall the all versions. i use same script in my tese machines.

Script automatically exit. it’s seems to be script not working properly.

I need to do any modification in the script. please clarify on this.

Mail id: appkesavarao@gmail.com

Just throwing this into the mix.

Microsoft provides scripts to uninstall Office and individual Office components (such as Visio).

The technet article is here:
https://blogs.technet.microsoft.com/odsupport/2011/04/08/how-to-obtain-and-use-offscrub-to-automate-the-uninstallation-of-office-products/

And the scripts on that page goes to here:
https://github.com/OfficeDev/Office-IT-Pro-Deployment-Scripts/tree/master/Office-ProPlus-Deployment/Remove-PreviousOfficeInstalls

I’ve used these in the past without issue, thought they can take some time to execute especially if you need to run multiple scripts.

Hi Aldin,

I have tried to uninstall Visio 2016 through the script which provided by you and unable to uninstall, could you suggest on this?

Aldin,

Nowadays we use office .xml to uninstall visio products from machine, you just need to know productid for the product you want to remove for office.

1 Like

Does anyone have a working All MS Project version of the script? If so can you make a download link to the ps1?