EI-Image-Viewer-Api/UnInstall/Program.cs

225 lines
6.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// See https://aka.ms/new-console-template for more information
using Newtonsoft.Json.Linq;
using Serilog;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Drawing;
using static System.Net.Mime.MediaTypeNames;
async Task ProcessStandardInputAsync(Process process, string cmd, string workDirectory = "")
{
if (!string.IsNullOrWhiteSpace(workDirectory))
{
process.StartInfo.WorkingDirectory = workDirectory;
}
await process.StandardInput.WriteLineAsync(cmd);
await process.StandardInput.FlushAsync();
while (!process.StandardOutput.EndOfStream)
{
var output = await process.StandardOutput.ReadLineAsync();
if (string.IsNullOrWhiteSpace(output))
{
break;
}
}
}
void DeleteFolderContents(string path)
{
DirectoryInfo directory = new DirectoryInfo(path);
foreach (FileInfo file in directory.GetFiles())
{
if (file.FullName.Contains("UnInstall"))
{
continue;
}
try
{
file.Attributes = FileAttributes.Normal;
file.Delete();
}
catch (IOException ex)
{
// 处理文件被占用的异常
MyLog($"File {file.FullName} is being used and cannot be deleted. {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
try
{
File.Delete(file.FullName);
}
catch (Exception ex2)
{
MyLog($"File {file.FullName} cannot be deleted. {ex2.Message}");
}
}
}
foreach (DirectoryInfo subDirectory in directory.GetDirectories())
{
subDirectory.Delete(true);
}
}
void MyLog(string message)
{
Console.WriteLine(message);
//Serilog.Log.Information(message);
}
//Serilog.Log.Logger = new LoggerConfiguration()
// .WriteTo.File("logs\\UninstallLog.txt", rollingInterval: RollingInterval.Day)
// .CreateLogger();
var startProList = Process.GetProcesses().Where(t => t.ProcessName.Contains("EI_Image_Viewer_Installer")).ToList();
foreach (var item in startProList)
{
item.Kill();
}
var configFolder = $@"C:\ProgramData\.xingcang\";
var configPath = Path.Combine(configFolder, "config.json");
if (!File.Exists(configPath))
{
MyLog("当前系统未部署影像系统,无须卸载");
Console.ReadLine();
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
MyLog("");
MyLog("警告卸载EI Image Viewer 服务,会将后台服务、数据库、网站文件以及运行的所有数据记录清除,请慎重操作。在卸载前,请确保数据已经备份。");
MyLog(" 您确定要继续卸载该服务吗Y/N");
Console.ResetColor();
string confirm = Console.ReadLine();
if (confirm.ToUpper() == "Y")
{
// 执行卸载操作
try
{
MyLog("开始读取激活信息...");
var appsettingsJson = File.ReadAllText(configPath);
// 解析 JSON 字符串
var jObject = JObject.Parse(appsettingsJson);
var configObj = new
{
key = jObject["key"].ToString(),
value = jObject["value"].ToString(),
user = jObject["user"].ToString(),
server = jObject["server"].ToString(),
password = jObject["password"].ToString(),
dbName = jObject["dbName"].ToString(),
deployFolder = jObject["deployFolder"].ToString(),
nginxStartPath = jObject["nginxStartPath"].ToString(),
//apiPath = jObject["apiPath"].ToString(),
serviceName = jObject["serviceName"].ToString(),
nginxServiceName = jObject["nginxServiceName"]?.ToString(),
nginxServiceEXEPath = jObject["nginxServiceEXEPath"]?.ToString(),
};
MyLog("激活信息读取完毕,开始准备卸载...");
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
//process.StartInfo.CreateNoWindow = false; // 不创建新窗口
process.Start();
MyLog("停止并卸载nginx服务...");
await ProcessStandardInputAsync(process, $" {configObj.nginxServiceEXEPath} uninstall ", configObj.nginxStartPath);
await ProcessStandardInputAsync(process, $"sc stop {configObj.nginxServiceName}");
await ProcessStandardInputAsync(process, $"sc delete {configObj.nginxServiceName}");
await Task.Delay(2000);
var proList = Process.GetProcesses().Where(t => ((t.ProcessName.Contains("nginx") || t.ProcessName.Contains("nginxService")) && t.MainModule.FileName.Contains(configObj.nginxStartPath))).ToList();
foreach (var item in proList)
{
item.Kill();
}
MyLog("停止并卸载后端服务...");
await ProcessStandardInputAsync(process, $"sc stop {configObj.serviceName}");
await ProcessStandardInputAsync(process, $"sc delete {configObj.serviceName}");
MyLog("数据库若被其他进程或者连接正在使用,将会删除失败,您可以卸载完后手动删除遗留的数据库");
MyLog("执行删除数据库命令...");
await ProcessStandardInputAsync(process, $@" SQLCMD -S {configObj.server} -U {configObj.user} -P {configObj.password} -Q ""DROP DATABASE {configObj.dbName}"" ");
process.StandardInput.Close();
process.WaitForExit();
await Task.Delay(3000);
MyLog($"删除部署文件夹{configObj.deployFolder}下可删除的所有内容...");
DeleteFolderContents(configObj.deployFolder);
MyLog("删除激活信息...");
DeleteFolderContents(configFolder);
MyLog("EI Image Viewer 服务卸载完成。");
MyLog("3s 后自动退出...");
await Task.Delay(3000);
string cmdArgs = $"/C ping 127.0.0.1 -n 3 & rmdir /s /q \"{configObj.deployFolder}\"";
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", cmdArgs);
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.CreateNoWindow = true;
Process.Start(psi);
Environment.Exit(0);
}
catch (Exception ex)
{
MyLog("卸载过程遇到问题:" + ex.Message + " 请检查是否有其他程序占用了相关资源,请确认后再重新卸载。");
Console.ReadLine();
}
}
}