fix readme and add eula
This commit is contained in:
Родитель
e3089d6648
Коммит
05703ac62d
34
ReadMe.md
34
ReadMe.md
|
@ -1,7 +1,14 @@
|
|||
Visual Studio Uninstaller
|
||||
Visual Studio Uninstaller
|
||||
=========
|
||||
|
||||
Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is designed to thoroughly and reliably remove these unwanted artifacts.
|
||||
This executable is designed to cleanup/scorch all Preview/RC/RTM releases of Visual Studio 2013, Visual Studio 2015 and Visual Studio vNext. It should be used as the last resort to clean up the user's system before resorting to reimaging the machine.
|
||||
|
||||
Running this application will break Visual Studio 2012 and earlier versions of Visual Studio because Visual Studio 2012 have some MSIs that have the same upgrade codes as Visual Studio 2013 and above.
|
||||
|
||||
How it works?
|
||||
========
|
||||
|
||||
This app finds and uninstall every Preview/RC/RTM releases of Visual Studio 2013/2015/vNext. It will first execute uninstall command on the bundle, and then it will uninstall any stale MSIs. The application contains a master list of Bundle IDs and upgrade codes for every MSI ever chained in by Visual Studio 2013-vNext. It will not uninstall MSU or MSIs that marked as ReallyPermanent.
|
||||
|
||||
Status
|
||||
========
|
||||
|
@ -24,12 +31,7 @@ Usage
|
|||
|
||||
**How to debug Total Uninstaller remotely?**
|
||||
|
||||
Uncommenting the following lines will not execute the actual uninstall. A debug flag will be added in the future.
|
||||
|
||||
//uti.bDebug = op.Debug; ip.DebugReporting = op.Debug;
|
||||
//ip.DoNotExecuteProcess = true;
|
||||
|
||||
Note: Do not run this on your development machine without setting the `DoNotExecuteProcess` flag. This will prevent the application from uninstalling the very development environment you are working from.
|
||||
IMPORTANT: Do not run this on your development machine without setting the `DoNotExecuteProcess` flag. This will prevent the application from uninstalling the very development environment you are working from.
|
||||
|
||||
To get the most out of the debug experience, I recommend the following:
|
||||
|
||||
|
@ -44,14 +46,16 @@ To get the most out of the debug experience, I recommend the following:
|
|||
|
||||
**Using Total Uninstall:**
|
||||
|
||||
1. The user identifies which SKU of which release he wants to uninstall.
|
||||
2. The user downloads one or more data files (from `DataFiles` folder) to a local folder.
|
||||
3. The user executes Total Uninstaller and then `dir` to the directory containing the config files.
|
||||
4. The user executes `load` command to the config files.
|
||||
5. The user executes `list` to show which SKU and release is selected and installed.
|
||||
6. The user executes `select` to select which SKU, release, version he wants to uninstall.
|
||||
1. Download and unzip the zip file to a folder.
|
||||
2. Open cmd.exe with Administrative privileges
|
||||
2. Execute Setup.ForcedUninstall.exe
|
||||
3. Press Y and hit enter to run the application.
|
||||
|
||||
The user executes `uninstall` to perform the total uninstall.
|
||||
**Commands:**
|
||||
|
||||
1. help or /help or /? : Print usage.
|
||||
2. break : run the application and pause until the user hit any key.
|
||||
3. noprocess : run the application but does not uninstall anything.
|
||||
|
||||
Roadmap
|
||||
========
|
||||
|
|
Двоичный файл не отображается.
|
@ -26,9 +26,9 @@ namespace Microsoft.VS.Uninstaller
|
|||
string wixpdbsPathsFile = string.Empty;
|
||||
string[] wixpdbsPaths = null;
|
||||
string dataFilePath = string.Empty;
|
||||
//args = new string[] { "noprocess", @"/wixpdbs:C:\Users\tobyhu\Desktop\test\paths.txt" };
|
||||
//args = new string[] { "noprocess", @"/binfile:C:\Users\tobyhu\Desktop\test\DataFile.bin" };
|
||||
//args = new string[] { "noprocess", @"/binfile:C:\Users\tobyhu\Desktop\test\DataFile.bin", @"/wixpdbs:\\dexshare01\Drops\tobyhu\wixpdbsPS\vsumain\Files.txt" };
|
||||
//args = new string[] { "noprocess", @"/wixpdbs:C:\Users\user\Desktop\test\paths.txt" };
|
||||
//args = new string[] { "noprocess", @"/binfile:C:\Users\user\Desktop\test\DataFile.bin" };
|
||||
//args = new string[] { "noprocess", @"/binfile:C:\Users\user\Desktop\test\DataFile.bin", @"/wixpdbs:\\myshare\Drops\user\wixpdbsPS\sub\Files.txt" };
|
||||
if (args != null && args.Count() > 0)
|
||||
{
|
||||
foreach (var arg in args)
|
||||
|
@ -132,8 +132,10 @@ namespace Microsoft.VS.Uninstaller
|
|||
ip.LoadFromDataFile(stream);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ip.InstalledVisualStudioReport();
|
||||
Logger.LogWithOutput("WARNING: This executable is designed to cleanup/scorch all Preview/RC/RTM releases of Visual Studio 2013, Visual Studio 2015 and Visual Studio vNext.");
|
||||
Logger.LogWithOutput("It should be used as the last resort to clean up the user's system before resorting to reimaging the machine. ");
|
||||
Logger.LogWithOutput("Would you like to continue? [Y/N]");
|
||||
var action = Console.ReadLine();
|
||||
if (!string.IsNullOrEmpty(action) && action.StartsWith("y", StringComparison.OrdinalIgnoreCase))
|
||||
|
@ -172,12 +174,8 @@ namespace Microsoft.VS.Uninstaller
|
|||
Console.WriteLine("Welcome to Total Uninstaller.");
|
||||
Console.WriteLine("Running this application will remove Visual Studio 2013/2015/vNext completely.");
|
||||
Console.WriteLine("It should be used as the last resort to clean up your machine.");
|
||||
Console.WriteLine("The application contains a master list of UpgradeCodes and ProductCode (if no UpgradeCode in the MSI) for all preview/RC/RTM releases of Visual Studio 2013/2015/vNext.");
|
||||
Console.WriteLine("----------- Normal Usage --------------");
|
||||
Console.WriteLine("Please run this application as administrator without any parameter.");
|
||||
Console.WriteLine("----------- Advanced Usage ---------------------");
|
||||
Console.WriteLine(@"/binfile:C:\Users\user\Desktop\test\DataFile.bin can be passed in to override the list of things to uninstall.");
|
||||
Console.WriteLine(@"/wixpdbs:C:\Users\tobyhu\Desktop\test\paths.txt can be passed in to generate a data file.");
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
|
|
@ -102,7 +102,7 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
/// <param name="installDate"></param>
|
||||
/// <param name="installLocation"></param>
|
||||
/// <param name="url"></param>
|
||||
public Package(string upgradecode, string productcode, string productversion, string productname, string chainingpackage, DateTime installDate, string installLocation, System.Uri url)
|
||||
public Package(string upgradecode, string productcode, string productversion, string productname, string chainingpackage)
|
||||
{
|
||||
Initialize();
|
||||
Type = PackageType.MSI;
|
||||
|
@ -111,9 +111,6 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
ProductVersion = productversion;
|
||||
ProductName = productname;
|
||||
ChainingPackage = chainingpackage;
|
||||
InstallDate = installDate;
|
||||
InstallLocation = installLocation;
|
||||
Url = url;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -126,7 +123,7 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
/// <param name="installDate"></param>
|
||||
/// <param name="installLocation"></param>
|
||||
/// <param name="url"></param>
|
||||
public Package(string productcode, string productversion, string productname, string chainingpackage, DateTime installDate, string installLocation, System.Uri url)
|
||||
public Package(string productcode, string productversion, string productname, string chainingpackage)
|
||||
{
|
||||
Initialize();
|
||||
Type = PackageType.MSI;
|
||||
|
@ -134,9 +131,6 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
ProductVersion = productversion;
|
||||
ProductName = productname;
|
||||
ChainingPackage = chainingpackage;
|
||||
InstallDate = installDate;
|
||||
InstallLocation = installLocation;
|
||||
Url = url;
|
||||
}
|
||||
/// <summary>
|
||||
/// Overloaded value to allow a different value for PackageType to be set.
|
||||
|
@ -149,7 +143,7 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
/// <param name="installLocation"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="type"></param>
|
||||
public Package(string productcode, string productversion, string productname, string chainingpackage, DateTime installDate, string installLocation, System.Uri url, PackageType type)
|
||||
public Package(string productcode, string productversion, string productname, string chainingpackage, PackageType type)
|
||||
{
|
||||
Initialize();
|
||||
Type = type;
|
||||
|
@ -157,9 +151,6 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
ProductVersion = productversion;
|
||||
ProductName = productname;
|
||||
ChainingPackage = chainingpackage;
|
||||
InstallDate = installDate;
|
||||
InstallLocation = installLocation;
|
||||
Url = url;
|
||||
}
|
||||
#endregion Public Constructors
|
||||
|
||||
|
|
|
@ -107,7 +107,6 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
/// <returns></returns>
|
||||
public string ApplyFilter(string Source)
|
||||
{
|
||||
Logger.Log(String.Format(CultureInfo.InvariantCulture, "Applying filters"), Logger.MessageLevel.Verbose, AppName);
|
||||
foreach (Filter fil in filters) { Source = Source.Replace(fil.ReplaceSource, fil.ReplaceValue); }
|
||||
return Source;
|
||||
}
|
||||
|
@ -137,19 +136,15 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
Logger.Log(String.Format(CultureInfo.InvariantCulture, "Do we already have an object in memory?", AppName), Logger.MessageLevel.Verbose, AppName);
|
||||
if (installedmsis.FirstOrDefault() == null)
|
||||
{
|
||||
var hi = ProductInstallation.GetProducts(null, null, UserContexts.All);
|
||||
Logger.Log(String.Format(CultureInfo.InvariantCulture, "No installpackages object found - creating", AppName), Logger.MessageLevel.Verbose, AppName);
|
||||
|
||||
installations = ProductInstallation.GetProducts(null, null, UserContexts.All)
|
||||
.Where(ins => ins.ProductName != null)
|
||||
.Select(ins => new Package(
|
||||
this.GetUpgradeCode(ins.LocalPackage),
|
||||
ins.ProductCode,
|
||||
ins.ProductVersion.ToString(),
|
||||
ApplyFilter(ins.ProductName),
|
||||
null,
|
||||
(DateTime)ins.InstallDate,
|
||||
ins.InstallLocation,
|
||||
ins.UrlInfoAbout
|
||||
ins.ProductVersion == null ? "0.0.0" : ins.ProductVersion.ToString(),
|
||||
ApplyFilter(string.IsNullOrEmpty(ins.ProductName) ? "(NOTDEFINED)" : ins.ProductName),
|
||||
null
|
||||
)
|
||||
)
|
||||
.OrderBy(ins => ins.ProductName).ToList();
|
||||
|
@ -182,8 +177,11 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
|
||||
foreach(var keyPath in keyPaths)
|
||||
{
|
||||
Logger.LogWithOutput(string.Format("Deleting registry: {0}", keyPath));
|
||||
this.DeleteRegistryKey(keyPath);
|
||||
if (!this.DoNotExecuteProcess)
|
||||
{
|
||||
Logger.LogWithOutput(string.Format("Deleting registry: {0}", keyPath));
|
||||
this.DeleteRegistryKey(keyPath);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -211,7 +209,7 @@ namespace Microsoft.VS.ConfigurationManager
|
|||
{
|
||||
try
|
||||
{
|
||||
if (Directory.Exists(CommonApplicationDataDirectory))
|
||||
if (Directory.Exists(CommonApplicationDataDirectory) && !this.DoNotExecuteProcess)
|
||||
{
|
||||
Logger.LogWithOutput(string.Format("Deleting: {0}", CommonApplicationDataDirectory));
|
||||
this.RecursivelyDeleteFolder(CommonApplicationDataDirectory);
|
||||
|
|
Загрузка…
Ссылка в новой задаче