string ProcessRestart(string command) { // 子参数 string param = command.Substring("restart".Length).Trim().ToLower(); if ( // string.IsNullOrEmpty(param) param == "computer") { // 重启电脑 Task.Run(async() => { try { // 为 dp2ssl 开机后自动重启预先设定好 cmdlineparam.txt 文件 WriteParameterFile(); await Task.Delay(1000); // https://stackoverflow.com/questions/4286354/restart-computer-from-winforms-app ProcessStartInfo proc = new ProcessStartInfo(); proc.WindowStyle = ProcessWindowStyle.Hidden; proc.FileName = "cmd"; proc.Arguments = "/C shutdown -f -r"; Process.Start(proc); } catch { } }); return("服务器将在一秒后重新启动"); } if (param != null && param.StartsWith("dp2ssl")) { // 子参数。默认 silently bool silently = true; { string arg = param.Substring("dp2ssl".Length).Trim(); if (arg != null && arg.StartsWith("interact")) { silently = false; } } // 重启 dp2ssl ExitProcess("dp2SSL", false); Thread.Sleep(5000); if (HasModuleStarted(MutexName) == true) { ExitProcess("dp2SSL", true); } try { // 启动 // StartModule(ShortcutPath, ""); // Process.Start("c:\\dp2ssl\\dp2ssl.exe"); string exe_path1 = "c:\\dp2ssl\\greensetup.exe"; string exe_path2 = "c:\\dp2ssl\\dp2ssl.exe"; if (File.Exists(exe_path1)) { // 注意命令行参数第一个字符应该是空格 ProcessExtensions.StartProcessAsCurrentUser(exe_path1, silently ? " silently" : ""); } else if (File.Exists(exe_path2)) { // 启动之前,检查 .zip 是否已经展开 { string binDir = "c:\\dp2ssl"; // *** 检查状态文件 // result.Value // -1 出错 // 0 不存在状态文件 // 1 正在下载 .zip 过程中。.zip 不完整 // 2 当前 .zip 和 .exe 已经一样新 // 3 当前 .zip 比 .exe 要新。需要展开 .zip 进行更新安装 // 4 下载 .zip 失败。.zip 不完整 // 5 当前 .zip 比 .exe 要新,需要重启计算机以便展开的文件生效 var check_result = GreenInstaller.CheckStateFile(binDir); // 展开 if (check_result.Value == 3) { var extract_result = GreenInstaller.ExtractFiles(binDir); if (extract_result.Value == -1) { // TODO: 写入错误日志 WriteErrorLog($"展开压缩文件时出错: {extract_result.ErrorInfo}"); } } } // 注意命令行参数第一个字符应该是空格 ProcessExtensions.StartProcessAsCurrentUser(exe_path2, silently ? " silently" : ""); } else { return($"{exe_path1} 和 {exe_path2} 均未找到,无法启动"); } return("dp2SSL 已经重新启动"); } catch (Exception ex) { return($"启动过程出现异常: {ExceptionUtil.GetDebugText(ex)}"); } } return($"命令 '{command}' 未知的子参数 '{param}'"); }
// 启动 dp2ssl.exe;或首次安装;或升级并启动 dp2ssl.exe // parameters: // delayUpdate 是否让 dp2ssl.exe 启动起来再探测升级? // 意思就是,== true,让 dp2ssl.exe 去负责升级,而 greensetup.exe 这里不负责下载升级(只负责展开下载好的 .zip)。这样的特点是启动速度快 // == false,让 greensetup.exe 直接探测下载升级,缺点是 dp2ssl.exe 启动就晚一点 // 但首次安装的时候,则是 greensetup.exe 负责下载 .zip 文件并安装。因为此时 dp2ssl.exe 还并不存在 async Task Start(bool delayUpdate) { // *** 检查 dp2ssl.exe 是否已经在运行 if (GreenInstaller.HasModuleStarted("{75BAF3F0-FF7F-46BB-9ACD-8FE7429BF291}") == true) { ErrorBox("dp2SSL 已经启动了,无法重复启动"); Application.Exit(); return; } // testing // await Task.Delay(5000); // 延时 30 秒,避免上一个 dp2ssl.exe 尚未彻底退出。如果没有彻底退出,会导致本次展开 .zip 文件时候覆盖失败 if (IsDelay()) { // TODO: 出现 Splash 窗口或者文字提示请等待 var old_style = this.progressBar1.Style; this.Invoke(new Action(() => { this.progressBar1.Style = ProgressBarStyle.Marquee; this.label_message.Text = "请等待 ..."; })); try { // TODO: 可以改进为不断观察,等到另一个 dp2ssl.exe 如果退出则结束等待 await Task.Delay(TimeSpan.FromSeconds(30)); } finally { this.Invoke(new Action(() => { this.progressBar1.Style = old_style; })); } } string strExePath = Path.Combine(_binDir, "dp2ssl.exe"); bool firstInstall = File.Exists(strExePath) == false; // *** 检查状态文件 // result.Value // -1 出错 // 0 不存在状态文件 // 1 正在下载 .zip 过程中。.zip 不完整 // 2 当前 .zip 和 .exe 已经一样新 // 3 当前 .zip 比 .exe 要新。需要展开 .zip 进行更新安装 // 4 下载 .zip 失败。.zip 不完整 // 5 当前 .zip 比 .exe 要新,需要重启计算机以便展开的文件生效 var check_result = GreenInstaller.CheckStateFile(_binDir); GreenInstaller.WriteInfoLog($"检查状态文件。check_result:{check_result.ToString()}"); // 展开,并启动 dp2ssl.exe if (check_result.Value == 3 || check_result.Value == 0) // 2020/9/11 增加 { GreenInstaller.WriteInfoLog($"将此前已经下载的 .zip 文件,展开,并立即启动 dp2ssl.exe"); // return: // -1 出错 // 0 成功。不需要 reboot // 2 成功,但需要立即重新启动计算机才能让复制的文件生效 var extract_result = GreenInstaller.ExtractFiles(_binDir); GreenInstaller.WriteInfoLog($"展开文件。extract_result:{extract_result.ToString()}"); if (extract_result.Value == -1) { if (extract_result.ErrorCode == "sourceFileNotFound") { GreenInstaller.WriteInfoLog($"{extract_result.ErrorInfo}, 所以改为进行首次安装"); goto FIRST_INSTALL; } ErrorBox(extract_result.ErrorInfo); return; } else if (extract_result.Value == 2) { // 2020/9/11 GreenInstaller.WriteInfoLog($"展开过程中发现部分文件被锁定了无法覆盖,已经被写入特殊文件,需要等下次 Windows 重启以后才能生效。本次依然用当前可执行文件启动 dp2ssl.exe"); // ErrorBox("部分文件更新受阻,请立即重新启动 Windows"); // TODO: 需要有个命令行参数,让 dp2ssl.exe 启动起来后明显提示用户看到信息和状态,需要重启 Windows } await ProcessStart(strExePath); return; } /* * if (check_result.Value == 1 || check_result.Value == 5) ||{ || ErrorBox(check_result.ErrorInfo); || Application.Exit(); || return; ||} */ /* * Debugger.Launch(); * * // 拷贝 greensetup.exe * string exePath = Assembly.GetExecutingAssembly().Location.ToLower(); * string targetExePath = Path.Combine(_binDir, "greensetup.exe"); * if (exePath.EndsWith("greensetup.exe") * && File.Exists(targetExePath) == false * && exePath.ToLower() != targetExePath.ToLower()) * { * MessageBox.Show(this, "copy greensetup.exe"); * Library.TryCreateDir(_binDir); * File.Copy(exePath, targetExePath, true); * } * else * MessageBox.Show(this, "not copy greensetup.exe"); */ if (firstInstall == false && delayUpdate) { GreenInstaller.WriteInfoLog($"非首次安装情形。立即启动 dp2ssl.exe"); await ProcessStart(strExePath); return; } FIRST_INSTALL: // 第一次安装 string style = "updateGreenSetupExe,debugInfo"; if (delayUpdate == false) { style += ",clearStateFile"; } if (firstInstall) { style += ",mustExpandZip"; // 无论是否有更新,都要展开两个 .zip 文件。因为 dp2ssl.exe 不存在,必须要展开 .zip 才能得到 } GreenInstaller.WriteInfoLog($"style={style}"); // *** 从 Web 升级 double ratio = 1; // 从 Web 服务器安装或者升级绿色版 // result.Value: // -1 出错 // 0 经过检查发现没有必要升级 // 1 成功 // 2 成功,但需要立即重新启动计算机才能让复制的文件生效 var result = await GreenInstaller.InstallFromWeb(GreenInstaller.dp2ssl_weburl, _binDir, style, //false, //true, _cancel.Token, (double min, double max, double value, string text) => { try { this.Invoke(new Action(() => { if (text != null) { label_message.Text = text; } if (min != -1) { progressBar1.Minimum = (Int32)min; } if (max != -1) { if (max <= Int32.MaxValue) { ratio = 1; progressBar1.Maximum = (Int32)max; } else { ratio = Int32.MaxValue / max; progressBar1.Maximum = Int32.MaxValue; } } if (value != -1) { progressBar1.Value = (int)((double)value * ratio); } })); } catch { } }); GreenInstaller.WriteInfoLog($"InstallFromWeb() 返回: \r\n{result.ToString()}"); if (result.Value == -1) { if (result.ErrorCode == "System.Net.WebException") { if (File.Exists(strExePath)) { await ProcessStart(strExePath); return; } } ErrorBox(result.ErrorInfo); Application.Exit(); return; } // result.Value == 2 要提醒重启 Windows 以完成安装 if (result.Value == 2) { ErrorBox(result.ErrorInfo); } // TODO: 从 dp2ssl.exe 中取信息? // 首次安装成功 if (firstInstall) { GreenInstaller.WriteInfoLog($"首次安装成功"); // 创建桌面快捷方式 GreenInstaller.CreateShortcut( "desktop", "dp2SSL 自助借还(绿色)", "dp2SSL 自助借还(绿色)", Path.Combine(_binDir, "greensetup.exe")); // "dp2ssl.exe" GreenInstaller.CreateShortcut( "startup", "dp2SSL 自助借还(绿色)", "dp2SSL 自助借还(绿色)", Path.Combine(_binDir, "greensetup.exe")); // "dp2ssl.exe" // 迁移用户文件夹 string sourceDirectory = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "dp2ssl"); /* * if (Directory.Exists(sourceDirectory)) * { * string targetDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "dp2\\dp2ssl"); * if (Directory.Exists(targetDirectory) == false) * { * var move_result = GreenInstaller.MoveUserDirectory(sourceDirectory, * targetDirectory, * _binDir, * "maskSource"); * GreenInstaller.WriteInfoLog($"迁移用户文件夹 sourceDirectory={sourceDirectory}, targetDirectory={targetDirectory}, move_result={move_result.ToString()}"); * } * else * { * GreenInstaller.WriteInfoLog($"绿色版用户文件夹 targetDirectory={targetDirectory} 已经存在,不再重复进行迁移"); * } * } */ string targetDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "dp2\\dp2ssl"); { var move_result = GreenInstaller.MoveUserDirectory(sourceDirectory, targetDirectory, _binDir, "maskSource"); GreenInstaller.WriteInfoLog($"迁移用户文件夹 sourceDirectory={sourceDirectory}, targetDirectory={targetDirectory}, move_result={move_result.ToString()}"); } } await ProcessStart(strExePath); return; }
// 启动 dp2ssl.exe;或首次安装;或升级并启动 dp2ssl.exe // parameters: // delayUpdate 是否让 dp2ssl.exe 启动起来再探测升级? // 意思就是,== true,让 dp2ssl.exe 去负责升级,而 greensetup.exe 这里不负责下载升级(只负责展开下载好的 .zip)。这样的特点是启动速度快 // == false,让 greensetup.exe 直接探测下载升级,缺点是 dp2ssl.exe 启动就晚一点 // 但首次安装的时候,则是 greensetup.exe 负责下载 .zip 文件并安装。因为此时 dp2ssl.exe 还并不存在 async Task Start(bool delayUpdate) { // *** 检查 dp2ssl.exe 是否已经在运行 if (GreenInstaller.HasModuleStarted("{75BAF3F0-FF7F-46BB-9ACD-8FE7429BF291}") == true) { ErrorBox("dp2SSL 已经启动了,无法重复启动"); Application.Exit(); return; } string strExePath = Path.Combine(_binDir, "dp2ssl.exe"); bool firstInstall = File.Exists(strExePath) == false; // *** 检查状态文件 // result.Value // -1 出错 // 0 不存在状态文件 // 1 正在下载 .zip 过程中。.zip 不完整 // 2 当前 .zip 和 .exe 已经一样新 // 3 当前 .zip 比 .exe 要新。需要展开 .zip 进行更新安装 // 4 下载 .zip 失败。.zip 不完整 // 5 当前 .zip 比 .exe 要新,需要重启计算机以便展开的文件生效 var check_result = GreenInstaller.CheckStateFile(_binDir); GreenInstaller.WriteInfoLog($"检查状态文件。check_result:{check_result.ToString()}"); // 展开,并启动 dp2ssl.exe if (check_result.Value == 3) { GreenInstaller.WriteInfoLog($"以前遗留的 .zip 文件,展开,并立即启动 dp2ssl.exe"); var extract_result = GreenInstaller.ExtractFiles(_binDir); if (extract_result.Value == -1) { ErrorBox(extract_result.ErrorInfo); return; } ProcessStart(strExePath); return; } /* * if (check_result.Value == 1 || check_result.Value == 5) ||{ || ErrorBox(check_result.ErrorInfo); || Application.Exit(); || return; ||} */ /* * Debugger.Launch(); * * // 拷贝 greensetup.exe * string exePath = Assembly.GetExecutingAssembly().Location.ToLower(); * string targetExePath = Path.Combine(_binDir, "greensetup.exe"); * if (exePath.EndsWith("greensetup.exe") * && File.Exists(targetExePath) == false * && exePath.ToLower() != targetExePath.ToLower()) * { * MessageBox.Show(this, "copy greensetup.exe"); * Library.TryCreateDir(_binDir); * File.Copy(exePath, targetExePath, true); * } * else * MessageBox.Show(this, "not copy greensetup.exe"); */ if (firstInstall == false && delayUpdate) { GreenInstaller.WriteInfoLog($"非首次安装情形。立即启动 dp2ssl.exe"); ProcessStart(strExePath); return; } string style = "updateGreenSetupExe"; if (delayUpdate == false) { style += ",clearStateFile"; } GreenInstaller.WriteInfoLog($"style={style}"); // *** 从 Web 升级 double ratio = 1; // 从 Web 服务器安装或者升级绿色版 // result.Value: // -1 出错 // 0 经过检查发现没有必要升级 // 1 成功 // 2 成功,但需要立即重新启动计算机才能让复制的文件生效 var result = await GreenInstaller.InstallFromWeb("http://dp2003.com/dp2ssl/v1_dev", _binDir, style, //false, //true, _cancel.Token, (double min, double max, double value, string text) => { this.Invoke(new Action(() => { if (text != null) { label_message.Text = text; } if (min != -1) { progressBar1.Minimum = (Int32)min; } if (max != -1) { if (max <= Int32.MaxValue) { ratio = 1; progressBar1.Maximum = (Int32)max; } else { ratio = Int32.MaxValue / max; progressBar1.Maximum = Int32.MaxValue; } } if (value != -1) { progressBar1.Value = (int)((double)value * ratio); } })); }); if (result.Value == -1) { if (result.ErrorCode == "System.Net.WebException") { if (File.Exists(strExePath)) { ProcessStart(strExePath); return; } } ErrorBox(result.ErrorInfo); Application.Exit(); return; } // TODO: 从 dp2ssl.exe 中取信息? // 首次安装成功 if (firstInstall) { GreenInstaller.WriteInfoLog($"首次安装成功"); // 创建桌面快捷方式 GreenInstaller.CreateShortcut( "desktop", "dp2SSL 自助借还(绿色)", "dp2SSL 自助借还(绿色)", Path.Combine(_binDir, "greensetup.exe")); // "dp2ssl.exe" GreenInstaller.CreateShortcut( "startup", "dp2SSL 自助借还(绿色)", "dp2SSL 自助借还(绿色)", Path.Combine(_binDir, "greensetup.exe")); // "dp2ssl.exe" // 迁移用户文件夹 string sourceDirectory = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "dp2ssl"); if (Directory.Exists(sourceDirectory)) { string targetDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "dp2\\dp2ssl"); var move_result = GreenInstaller.MoveUserDirectory(sourceDirectory, targetDirectory, _binDir, "maskSource"); GreenInstaller.WriteInfoLog($"迁移用户文件夹 sourceDirectory={sourceDirectory}, targetDirectory={targetDirectory}, move_result={move_result.ToString()}"); } } ProcessStart(strExePath); return; }