diff --git a/LKY_OfficeTools/Lib/Lib_AppInfo.cs b/LKY_OfficeTools/Lib/Lib_AppInfo.cs
index 03b347c..9e216d2 100644
--- a/LKY_OfficeTools/Lib/Lib_AppInfo.cs
+++ b/LKY_OfficeTools/Lib/Lib_AppInfo.cs
@@ -51,7 +51,7 @@ internal class AppAttribute
///
/// APP 版本号
///
- internal const string AppVersion = "1.2.1.526";
+ internal const string AppVersion = "1.2.1.621";
///
/// 开发者拼音全拼
diff --git a/LKY_OfficeTools/Lib/Lib_AppLog.cs b/LKY_OfficeTools/Lib/Lib_AppLog.cs
index e80e7f1..dd2380c 100644
--- a/LKY_OfficeTools/Lib/Lib_AppLog.cs
+++ b/LKY_OfficeTools/Lib/Lib_AppLog.cs
@@ -9,7 +9,7 @@
using System;
using System.IO;
using static LKY_OfficeTools.Lib.Lib_AppInfo.AppPath;
-using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall;
+using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInfo;
namespace LKY_OfficeTools.Lib
{
@@ -78,6 +78,9 @@ internal Log(string str, ConsoleColor str_color, Output_Type output_type = Outpu
{
Console.ForegroundColor = str_color;
Console.WriteLine(str);
+
+ //输出后恢复颜色
+ Console.ForegroundColor = ConsoleColor.Gray;
}
//需要输出日志文件时,进行判断
diff --git a/LKY_OfficeTools/Lib/Lib_AppReport.cs b/LKY_OfficeTools/Lib/Lib_AppReport.cs
index c538ad2..f0971b7 100644
--- a/LKY_OfficeTools/Lib/Lib_AppReport.cs
+++ b/LKY_OfficeTools/Lib/Lib_AppReport.cs
@@ -33,14 +33,14 @@ internal class Lib_AppReport
///
internal static bool Pointing(ProcessStage point_type, bool show_info = false)
{
- try
+ //Passive不打点
+ if (Current_RunMode == RunMode.Passive)
{
- //Passive不打点
- if (Current_RunMode == RunMode.Passive)
- {
- return true;
- }
+ return true;
+ }
+ try
+ {
if (show_info && point_type != ProcessStage.Starting)
{
new Log($"\n------> 正在清理 冗余数据,请勿关闭或重启电脑 ...", ConsoleColor.DarkCyan);
diff --git a/LKY_OfficeTools/Lib/Lib_AppUpdate.cs b/LKY_OfficeTools/Lib/Lib_AppUpdate.cs
index e25d7c0..a9a582d 100644
--- a/LKY_OfficeTools/Lib/Lib_AppUpdate.cs
+++ b/LKY_OfficeTools/Lib/Lib_AppUpdate.cs
@@ -213,7 +213,7 @@ internal static bool Check()
//升级成功打点
Current_StageType = ProcessStage.Update_Success;
- Pointing(Current_StageType);
+ Pointing(ProcessStage.Update_Success);
//延迟稍许
Thread.Sleep(2000);
@@ -263,7 +263,7 @@ static void ManualUpdate()
//自动升级失败
Current_StageType = ProcessStage.Update_Fail; //设置为失败
- Pointing(Current_StageType, true); //回收
+ Pointing(ProcessStage.Update_Fail, true); //回收
KeyMsg.Quit(-20);
}
diff --git a/LKY_OfficeTools/Lib/Lib_Aria2c.cs b/LKY_OfficeTools/Lib/Lib_Aria2c.cs
index a47be67..56f3c74 100644
--- a/LKY_OfficeTools/Lib/Lib_Aria2c.cs
+++ b/LKY_OfficeTools/Lib/Lib_Aria2c.cs
@@ -42,7 +42,8 @@ internal static int DownFile(string uri, string save_to)
string filename = new FileInfo(save_to).Name; //保存的文件名
//设置命令行
- string aria2c_params = $"{uri} --dir=\"{file_path}\" --out=\"{filename}\" --continue=true --max-connection-per-server=5 --check-integrity=true --file-allocation=none";
+ string aria2c_params = $"{uri} --dir=\"{file_path}\" --out=\"{filename}\"" +
+ $" --continue=true --max-connection-per-server=5 --check-integrity=true --file-allocation=none --console-log-level=error";
//new Log(aria2c_params);
var down_result = Com_ExeOS.Run.Exe(aria2c_path, aria2c_params);
diff --git a/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs b/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs
index 35fe4e2..447018b 100644
--- a/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs
+++ b/LKY_OfficeTools/Lib/Lib_OfficeActivate.cs
@@ -15,7 +15,7 @@
using static LKY_OfficeTools.Lib.Lib_AppInfo.AppPath;
using static LKY_OfficeTools.Lib.Lib_AppLog;
using static LKY_OfficeTools.Lib.Lib_OfficeInfo;
-using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall;
+using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInfo;
namespace LKY_OfficeTools.Lib
{
@@ -24,14 +24,6 @@ namespace LKY_OfficeTools.Lib
///
internal class Lib_OfficeActivate
{
- ///
- /// 重载实现激活
- ///
- internal Lib_OfficeActivate()
- {
- Activating();
- }
-
///
/// KMS 服务器列表
///
@@ -97,7 +89,7 @@ internal static int StartActivate(string kms_server = "kms.chinancce.com")
string cmd_kms_url = $"cscript ospp.vbs /sethst:{kms_server}"; //设置激活KMS地址
string cmd_activate = "cscript ospp.vbs /act"; //开始激活
- new Log($"\n------> 正在激活 Office v{OfficeNetVersion.latest_version} ...", ConsoleColor.DarkCyan);
+ new Log($"\n------> 正在激活 Office v{OfficeNetInfo.OfficeLatestVersion} ...", ConsoleColor.DarkCyan);
//执行:设置激活KMS地址
string kms_flag = kms_server.Replace("kms.", "");
@@ -225,7 +217,7 @@ internal static int StartActivate(string kms_server = "kms.chinancce.com")
return -1;
}
- new Log($" √ 已完成 Office v{OfficeNetVersion.latest_version} 正版激活。", ConsoleColor.DarkGreen);
+ new Log($" √ 已完成 Office v{OfficeNetInfo.OfficeLatestVersion} 正版激活。", ConsoleColor.DarkGreen);
Lib_AppState.Current_StageType = Lib_AppState.ProcessStage.Finish_Success; //设置整体运行状态为成功
return 1;
diff --git a/LKY_OfficeTools/Lib/Lib_OfficeClean.cs b/LKY_OfficeTools/Lib/Lib_OfficeClean.cs
index 7aa0c91..8ffe6d2 100644
--- a/LKY_OfficeTools/Lib/Lib_OfficeClean.cs
+++ b/LKY_OfficeTools/Lib/Lib_OfficeClean.cs
@@ -53,8 +53,8 @@ internal static bool RemoveAllOffice()
Uninstall.BySaRA();
//无论哪种方式清理,都要再检查一遍是否卸载干净。如果 当前系统 Office 版本数量 > 0,启动强制模式
- var installed_office = OfficeLocalInstall.GetArchiDir();
- var license_list = OfficeLocalInstall.LicenseInfo();
+ var installed_office = OfficeLocalInfo.GetArchiDir();
+ var license_list = OfficeLocalInfo.LicenseInfo();
if (
(installed_office != null && installed_office.Count > 0) || //存在残留的Office注册表/文件目录
license_list != null && license_list.Count > 0 //存在残留的许可证信息
@@ -86,7 +86,7 @@ internal static bool Delete()
try
{
//获取激活信息
- var office_installed_key = OfficeLocalInstall.LicenseInfo();
+ var office_installed_key = OfficeLocalInfo.LicenseInfo();
if (office_installed_key != null && office_installed_key.Count > 0)
{
@@ -108,7 +108,7 @@ internal static bool Delete()
}
//逐一卸载后,若都为 success,则再执行一次检查
- office_installed_key = OfficeLocalInstall.LicenseInfo(); //再度获取list
+ office_installed_key = OfficeLocalInfo.LicenseInfo(); //再度获取list
if (office_installed_key.Count == 0) //为0,视为成功
{
return true;
@@ -151,7 +151,7 @@ internal static bool ForceDelete()
try
{
//有些文件可能无法彻底删除,但如果后面复查时,不影响安装,则不会返回 false
- var office_installed_dir = OfficeLocalInstall.GetArchiDir();
+ var office_installed_dir = OfficeLocalInfo.GetArchiDir();
if (office_installed_dir != null && office_installed_dir.Count > 0)
{
foreach (var now_dir in office_installed_dir) //遍历查询所有目录,将其删除
@@ -213,7 +213,7 @@ internal static bool ForceDelete()
}
//复查是否干净了
- var installed_info = OfficeLocalInstall.GetArchiDir();
+ var installed_info = OfficeLocalInfo.GetArchiDir();
if (installed_info != null && installed_info.Count > 0)
{
throw new Exception();
@@ -372,7 +372,7 @@ internal static bool BySaRA()
new Log($"\n------> 正在卸载 Office 冗余版本 ...", ConsoleColor.DarkCyan);
//获取目前存留的版本
- var install_list = OfficeLocalInstall.GetArchiDir();
+ var install_list = OfficeLocalInfo.GetArchiDir();
if (install_list == null || install_list.Count == 0)
{
//已经不存在残留版本时,直接返回卸载成功
diff --git a/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs b/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs
index d011d08..653b1df 100644
--- a/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs
+++ b/LKY_OfficeTools/Lib/Lib_OfficeDownload.cs
@@ -12,7 +12,6 @@
using static LKY_OfficeTools.Lib.Lib_AppInfo;
using static LKY_OfficeTools.Lib.Lib_AppLog;
using static LKY_OfficeTools.Lib.Lib_OfficeInfo;
-using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall;
namespace LKY_OfficeTools.Lib
{
@@ -21,61 +20,30 @@ namespace LKY_OfficeTools.Lib
///
internal class Lib_OfficeDownload
{
- ///
- /// 下载文件列表
- ///
- static List down_list = null;
-
- ///
- /// 重载实现下载
- ///
- internal Lib_OfficeDownload()
- {
- //FilesDownload();
- }
-
///
/// 下载所有文件(Aria2c)
- /// 返回值:-1【用户终止】,0【下载失败】,1【下载成功】,2【无需下载】
+ /// 返回值:-1【用户终止】,0【下载失败】,1【下载成功】
///
- internal static int FilesDownload()
+ internal static int StartDownload()
{
try
{
- //获取下载列表
- down_list = OfficeNetVersion.GetOfficeFileList();
- if (down_list == null)
- {
- //因列表获取异常,停止下载
- return 0;
- }
-
- //判断是否已经安装了当前版本
- InstallState install_state = GetOfficeState();
- if (install_state==InstallState.Correct) //已安装最新版,无需下载
- {
- new Log($"\n * 当前系统安装了最新 Office 版本,已跳过下载、安装流程。", ConsoleColor.DarkMagenta);
- return 2;
- }
- ///当不存在 VersionToReport or 其版本与最新版不一致 or 产品ID不一致 or 安装位数与系统不一致时,需要下载新文件。
-
- //定义下载目标地
- string save_to = AppPath.ExecuteDir + @"\Office\Data\"; //文件必须位于 \Office\Data\ 下,
- //ODT安装必须在 Office 上一级目录上执行。
+ //定义下载目标地。文件必须位于 \Office\Data\下。ODT安装必须在 Office 上一级目录上执行。
+ string save_to = AppPath.ExecuteDir + @"\Office\Data\";
//计划保存的地址
List save_files = new List();
//下载开始
- new Log($"\n------> 开始下载 Office v{OfficeNetVersion.latest_version} 文件 ...", ConsoleColor.DarkCyan);
+ new Log($"\n------> 开始下载 Office v{OfficeNetInfo.OfficeLatestVersion} 文件 ...", ConsoleColor.DarkCyan);
//延迟,让用户看到开始下载
Thread.Sleep(1000);
//轮询下载所有文件
- foreach (var a in down_list)
+ foreach (var a in OfficeNetInfo.OfficeFileList)
{
//根据官方目录,来调整下载保存位置
- string save_path = save_to + a.Substring(OfficeNetVersion.office_file_root_url.Length).Replace("/", "\\");
+ string save_path = save_to + a.Substring(OfficeNetInfo.OfficeUrlRoot.Length).Replace("/", "\\");
//保存到List里面,用于后续检查
save_files.Add(save_path);
@@ -99,7 +67,7 @@ internal static int FilesDownload()
new Log($" √ 已下载 {new FileInfo(save_path).Name} 文件。", ConsoleColor.DarkGreen);
}
- new Log($"\n------> 正在检查 Office v{OfficeNetVersion.latest_version} 文件 ...", ConsoleColor.DarkCyan);
+ new Log($"\n------> 正在检查 Office v{OfficeNetInfo.OfficeLatestVersion} 文件 ...", ConsoleColor.DarkCyan);
foreach (var b in save_files)
{
@@ -113,11 +81,11 @@ internal static int FilesDownload()
else
{
new Log($" >> 文件 {new FileInfo(b).Name} 存在异常,重试中 ...", ConsoleColor.DarkRed);
- return FilesDownload();
+ return StartDownload();
}
}
- new Log($" √ 已完成 Office v{OfficeNetVersion.latest_version} 下载。", ConsoleColor.DarkGreen);
+ new Log($" √ 已完成 Office v{OfficeNetInfo.OfficeLatestVersion} 下载。", ConsoleColor.DarkGreen);
return 1;
}
diff --git a/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs b/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs
index 7443dc7..d493976 100644
--- a/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs
+++ b/LKY_OfficeTools/Lib/Lib_OfficeInfo.cs
@@ -11,7 +11,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using System.Threading;
using static LKY_OfficeTools.Common.Com_SystemOS;
using static LKY_OfficeTools.Lib.Lib_AppInfo;
using static LKY_OfficeTools.Lib.Lib_AppInfo.AppPath;
@@ -75,171 +74,245 @@ internal enum OfficeArchi
///
/// 查看 Office 网络的版本类库
///
- internal class OfficeNetVersion
+ internal class OfficeNetInfo
{
+ private static string _office_channel_info;
///
- /// 最新版 Office 版本信息
- ///
- internal static Version latest_version = null;
-
- ///
- /// 要下载的 Office 文件的根网址
- ///
- internal static string office_file_root_url;
-
- ///
- /// 获取最新版本的 Office 函数
+ /// Office频道的信息
///
- ///
- internal static Version GetOfficeVersion()
+ internal static string OfficeChannelInfo
{
- try
+ get
{
- new Log("\n------> 正在获取 最新可用 Office 版本 ...", ConsoleColor.DarkCyan);
-
- //获取频道信息,得到可用 Url 列表
- string channel_info = Com_TextOS.GetCenterText(AppJson.Info, "\"OfficeChannels_Url\": \"", "\"");
- if (string.IsNullOrEmpty(channel_info))
+ try
{
- throw new Exception("OfficeChannels_Url 信息获取失败!");
- }
- List channel_list = channel_info.Split(';').ToList();
+ //私有值非空判断
+ if (!string.IsNullOrWhiteSpace(_office_channel_info))
+ {
+ return _office_channel_info;
+ }
- //遍历获取有效地址,并下载channel信息
- string office_info = null;
- int try_times = 1; //尝试获取次数,初始值为1
- foreach (var now_url in channel_list)
- {
- office_info = Com_WebOS.Visit_WebClient(now_url.Replace(" ", "")); //替换网址空格,并获得当前网址的访问信息
- if (!string.IsNullOrEmpty(office_info))
+ new Log("\n------> 正在获取 最新可用 Office 信息 ...", ConsoleColor.DarkCyan);
+
+ //获取频道信息,得到可用 Url 列表
+ string channel_info = Com_TextOS.GetCenterText(AppJson.Info, "\"OfficeChannels_Url\": \"", "\"");
+ if (string.IsNullOrEmpty(channel_info))
{
- //info有值,开始截取字段
+ throw new Exception("OfficeChannels_Url 信息获取失败!");
+ }
+ List channel_list = channel_info.Split(';').ToList();
- //获取版本信息
- string latest_info = Com_TextOS.GetCenterText(office_info, "\"PerpetualVL2021\",", "name"); //获取 2021 LTSC
- if (!string.IsNullOrEmpty(latest_info))
+ //遍历获取有效地址,并下载channel信息
+ string office_info = null;
+ int try_times = 1; //尝试获取次数,初始值为1
+ foreach (var now_url in channel_list)
+ {
+ office_info = Com_WebOS.Visit_WebClient(now_url.Replace(" ", "")); //替换网址空格,并获得当前网址的访问信息
+ if (!string.IsNullOrEmpty(office_info))
{
- //获取版本号
- latest_version = new Version(Com_TextOS.GetCenterText(latest_info, "latestUpdateVersion\":\"", "\"")); //官方Json取值,格式和自己的不一样,千万注意
+ new Log($" √ 已获得 Office 最新正版信息。", ConsoleColor.DarkGreen);
- //获取office下载地址
- office_file_root_url = Com_TextOS.GetCenterText(latest_info, "baseUrl\":\"", "\""); //官方Json取值,格式和自己的不一样,千万注意
+ //info有值,返回该值。
+ return _office_channel_info = office_info;
+ }
- //版本信息不为空,下载地址不为空时,返回
- if ((latest_version != null) && (!string.IsNullOrEmpty(office_file_root_url)))
- {
- return latest_version;
- }
+ //访问当前网址返回数据为空,或者无法截取获得有效字段时,遍历。
+ if (try_times < channel_list.Count)
+ {
+ new Log($" >> 尝试使用 {++try_times} 号服务器获取中 ...", ConsoleColor.DarkYellow);
+ continue;
}
}
- //访问当前网址返回数据为空,或者无法截取获得有效字段时,遍历。
- if (try_times < channel_list.Count)
- {
- new Log($" >> 尝试使用 {++try_times} 号服务器获取中 ...", ConsoleColor.DarkYellow);
- continue;
- }
+ //全部遍历完,依旧没返回,就说明全部失败
+ throw new Exception("Office 信息获取失败!");
+ }
+ catch (Exception Ex)
+ {
+ new Log(" × 最新 Office 信息获取失败,请稍后重试!", ConsoleColor.DarkRed);
+ new Log(Ex.ToString());
+ return null;
}
-
- //全部遍历完,依旧没返回,就说明全部失败,返回null。
- return null;
- }
- catch (Exception Ex)
- {
- new Log(Ex.ToString());
- return null;
}
-
}
+ private static Version _office_latest_version;
///
- /// 获取文件下载列表
+ /// 最新版 Office 版本信息
///
- ///
- internal static List GetOfficeFileList()
+ internal static Version OfficeLatestVersion
{
- try
+ get
{
- Version version_info = GetOfficeVersion(); //获取版本
-
- if (version_info == null || string.IsNullOrEmpty(office_file_root_url)) //下载根地址为空时,视为失败
+ try
{
- new Log(" × 最新版本获取失败,请稍后重试!", ConsoleColor.DarkRed);
- return null;
- }
+ //非空返回
+ if (_office_latest_version != null)
+ {
+ return _office_latest_version;
+ }
- string ver = version_info.ToString();
+ //非空判断
+ if (string.IsNullOrWhiteSpace(OfficeChannelInfo))
+ {
+ return null;
+ }
- new Log($" √ 已获得 Office v{ver} 正版信息。", ConsoleColor.DarkGreen);
+ new Log("\n------> 正在解析 最新可用 Office 版本 ...", ConsoleColor.DarkCyan);
- //延迟,让用户看清版本号
- Thread.Sleep(500);
+ //获取版本信息
+ string latest_info = Com_TextOS.GetCenterText(OfficeChannelInfo, "\"PerpetualVL2021\",", "name"); //获取 2021 LTSC
+ if (!string.IsNullOrEmpty(latest_info))
+ {
+ //获取版本号
+ var ver = new Version(Com_TextOS.GetCenterText(latest_info, "latestUpdateVersion\":\"", "\"")); //官方Json取值,格式和自己的不一样,千万注意
+ new Log($" √ 已获得 Office 最新版本为:v{ver}", ConsoleColor.DarkGreen);
- //获取文件列表
- List file_list = new List();
- office_file_root_url += "/office/data";
- ///获取当前系统位数
- int sys_bit;
- if (Environment.Is64BitOperatingSystem)
- {
- sys_bit = 64;
+ return _office_latest_version = ver;
+ }
+
+ throw new Exception("无法获取 PerpetualVL2021 对应的版本号!");
}
- else
+ catch (Exception Ex)
{
- sys_bit = 32;
+ new Log(" × 无法获取 最新可用 Office 版本,请稍后重试!", ConsoleColor.DarkRed);
+ new Log(Ex.ToString());
+ return null;
}
+ }
+ }
- //x32系统也需要下载 64 的 i64****.cab文件,但必须放在 {ver} 目录下。
- file_list.Add($"{office_file_root_url}/{ver}/i640.cab");
- file_list.Add($"{office_file_root_url}/{ver}/i642052.cab");
-
- switch (sys_bit)
+ private static string _office_url_root;
+ ///
+ /// 要下载的 Office 文件的根网址
+ ///
+ internal static string OfficeUrlRoot
+ {
+ get
+ {
+ try
{
- case 64:
- file_list.Add($"{office_file_root_url}/{ver}/stream.x{sys_bit}.x-none.dat");
- file_list.Add($"{office_file_root_url}/{ver}/stream.x{sys_bit}.zh-cn.dat");
- break;
- case 32:
- file_list.Add($"{office_file_root_url}/{ver}/stream.x86.x-none.dat");
- file_list.Add($"{office_file_root_url}/{ver}/stream.x86.zh-cn.dat");
- file_list.Add($"{office_file_root_url}/{ver}/i{sys_bit}0.cab");
- file_list.Add($"{office_file_root_url}/{ver}/i{sys_bit}2052.cab");
- break;
- }
+ //非空返回
+ if (!string.IsNullOrWhiteSpace(_office_url_root))
+ {
+ return _office_url_root;
+ }
+
+ //非空判断
+ if (string.IsNullOrWhiteSpace(OfficeChannelInfo))
+ {
+ return null;
+ }
+
+ new Log("\n------> 正在解析 最新可用 Office 下载服务器 ...", ConsoleColor.DarkCyan);
+
+ //获取版本信息
+ string latest_info = Com_TextOS.GetCenterText(OfficeChannelInfo, "\"PerpetualVL2021\",", "name"); //获取 2021 LTSC
+ if (!string.IsNullOrEmpty(latest_info))
+ {
+ //获取office下载地址
+ var url = Com_TextOS.GetCenterText(latest_info, "baseUrl\":\"", "\""); //官方Json取值,格式和自己的不一样,千万注意
- //按版本下载其余文件
- file_list.Add($"{office_file_root_url}/v{sys_bit}.cab");
- file_list.Add($"{office_file_root_url}/v{sys_bit}_{ver}.cab");
- file_list.Add($"{office_file_root_url}/{ver}/s{sys_bit}0.cab");
- file_list.Add($"{office_file_root_url}/{ver}/s{sys_bit}2052.cab");
+ new Log($" √ 已获得 Office 最新下载服务器信息", ConsoleColor.DarkGreen);
- /*
- Console.ForegroundColor = ConsoleColor.DarkYellow;
- new Log($"\n------> 预计下载文件:");
- foreach (var a in file_list)
+ return _office_url_root = url + "/office/data";
+ }
+
+ throw new Exception("无法获取 PerpetualVL2021 对应的下载地址!");
+ }
+ catch (Exception Ex)
{
- new Log($" > {a}");
+ new Log(" × 无法获取 最新可用 Office 下载服务器", ConsoleColor.DarkRed);
+ new Log(Ex.ToString());
+ return null;
}
- Console.Read();
- */
-
- return file_list;
}
+ }
- catch (Exception Ex)
+ private static List _office_file_list;
+ ///
+ /// Office 最新版的文件下载地址列表
+ ///
+ internal static List OfficeFileList
+ {
+ get
{
- new Log(Ex.ToString());
- return null;
- }
+ try
+ {
+ //非空返回
+ if (_office_file_list != null && _office_file_list.Count > 0)
+ {
+ return _office_file_list;
+ }
+
+ //下载根地址为空时,视为失败
+ if (OfficeLatestVersion == null || string.IsNullOrEmpty(OfficeUrlRoot))
+ {
+ return null;
+ }
+
+ new Log("\n------> 正在解析 Office 下载列表 ...", ConsoleColor.DarkCyan);
+
+ //获取文件列表
+ List result = new List();
+
+ //获取当前系统位数
+ int sys_bit;
+ if (Environment.Is64BitOperatingSystem)
+ {
+ sys_bit = 64;
+ }
+ else
+ {
+ sys_bit = 32;
+ }
+
+ //获得版本号的字符串
+ string ver = OfficeLatestVersion.ToString();
+
+ //x32系统也需要下载 64 的 i64****.cab文件,但必须放在 {ver} 目录下。
+ result.Add($"{OfficeUrlRoot}/{ver}/i640.cab");
+ result.Add($"{OfficeUrlRoot}/{ver}/i642052.cab");
+
+ switch (sys_bit)
+ {
+ case 64:
+ result.Add($"{OfficeUrlRoot}/{ver}/stream.x{sys_bit}.x-none.dat");
+ result.Add($"{OfficeUrlRoot}/{ver}/stream.x{sys_bit}.zh-cn.dat");
+ break;
+ case 32:
+ result.Add($"{OfficeUrlRoot}/{ver}/stream.x86.x-none.dat");
+ result.Add($"{OfficeUrlRoot}/{ver}/stream.x86.zh-cn.dat");
+ result.Add($"{OfficeUrlRoot}/{ver}/i{sys_bit}0.cab");
+ result.Add($"{OfficeUrlRoot}/{ver}/i{sys_bit}2052.cab");
+ break;
+ }
+
+ //按版本下载其余文件
+ result.Add($"{OfficeUrlRoot}/v{sys_bit}.cab");
+ result.Add($"{OfficeUrlRoot}/v{sys_bit}_{ver}.cab");
+ result.Add($"{OfficeUrlRoot}/{ver}/s{sys_bit}0.cab");
+ result.Add($"{OfficeUrlRoot}/{ver}/s{sys_bit}2052.cab");
+
+ new Log($" √ 已解析 Office 下载列表。", ConsoleColor.DarkGreen);
+
+ return _office_file_list = result;
+ }
+ catch (Exception Ex)
+ {
+ new Log(Ex.ToString());
+ return null;
+ }
+ }
}
}
///
/// 查看本地 Office 安装情况 类库
///
- internal class OfficeLocalInstall
+ internal class OfficeLocalInfo
{
///
/// Office 本地安装情况(标记)
@@ -297,58 +370,66 @@ internal static InstallState GetOfficeState()
if (office_reg_ver_list.Count == 1)
{
//只安装了1个ODT版本
- foreach (var now_ver in office_reg_ver_list)
- {
- //获取目标ID
- string Pop_Office_ID = "2021Volume";
+ //获取其版本号
+ Version installed_ver = null;
- //获取本机已经安装的ID(如果x64系统,安装了x32的 Office 在 WOW6432Node 目录,该值将为null)
- string Current_Office_ID = Register.Read.ValueBySystem(RegistryHive.LocalMachine, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "ProductReleaseIds");
-
- //ODT 只安装了1个版本,但 now_ver 为空,视为版本不同
- if (string.IsNullOrEmpty(Current_Office_ID))
- {
- return InstallState.Diff;
- }
+ //解析版本号
+ try
+ {
+ installed_ver = new Version(office_reg_ver_list[0]);
+ }
+ catch
+ {
+ //ODT 只安装了1个版本,但 now_ver 为空,或版本号解析失败,视为版本不同
+ return InstallState.Diff;
+ }
- //替换支持的版本ID。如果用户还安装了其它架构,进行替换后,该值不是空
- var diff_products = Current_Office_ID
- .Replace($"ProjectPro{Pop_Office_ID}", "")
- .Replace($"ProPlus{Pop_Office_ID}", "")
- .Replace($"VisioPro{Pop_Office_ID}", "")
- .Replace(",", "");
-
- if (
- (now_ver != null && now_ver == OfficeNetVersion.latest_version.ToString()) //版本号一致
- &&
- string.IsNullOrWhiteSpace(diff_products) //是否还安装了其它ID
- )
+ //获取目标ID
+ string Pop_Office_ID = "2021Volume";
+
+ //获取本机已经安装的ID(如果x64系统,安装了x32的 Office 在 WOW6432Node 目录,该值将为null)
+ string Current_Office_ID = Register.Read.ValueBySystem(RegistryHive.LocalMachine, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "ProductReleaseIds");
+
+ //替换支持的版本ID。如果用户还安装了其它架构,进行替换后,该值不是空
+ var diff_products = Current_Office_ID
+ .Replace($"ProjectPro{Pop_Office_ID}", "")
+ .Replace($"ProPlus{Pop_Office_ID}", "")
+ .Replace($"VisioPro{Pop_Office_ID}", "")
+ .Replace(",", "");
+
+ if (
+ //本地版本号非空 & 本地版本号 >= 官方最新版本号,就视为安装了最新版(因为可能会有安全更新补丁)
+ (installed_ver != null && installed_ver >= OfficeNetInfo.OfficeLatestVersion)
+ &&
+ string.IsNullOrWhiteSpace(diff_products) //是否还安装了其它ID
+ )
+ {
+ //x64系统还得校验下 Office 注册表的 平台信息 是否一致
+ if (Environment.Is64BitOperatingSystem)
{
- //x64系统还得校验下 Office 注册表的 平台信息 是否一致
- if (Environment.Is64BitOperatingSystem)
+ string platform = Register.Read.Value(RegistryHive.LocalMachine, RegistryView.Registry64, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "Platform");
+ if (string.IsNullOrWhiteSpace(platform) || platform == "x86")
{
- string platform = Register.Read.Value(RegistryHive.LocalMachine, RegistryView.Registry64, @"SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "Platform");
- if (string.IsNullOrWhiteSpace(platform) || platform == "x86")
- {
- return InstallState.Diff; //虽然出现在了与x64系统注册表匹配的路径,但是Office平台版本并非x64
- }
- else
- {
- //版本号一致、产品ID一致、注册表显示的位数一致
- return InstallState.Correct; //已经正确安装最新版
- }
+ return InstallState.Diff; //虽然出现在了与x64系统注册表匹配的路径,但是Office平台版本并非x64
}
else
{
- //x32系统,直接满足了
+ //版本号不小于官方最新版、产品ID一致、注册表显示的位数一致
return InstallState.Correct; //已经正确安装最新版
}
}
+ else
+ {
+ //x32系统,直接满足了
+ return InstallState.Correct; //已经正确安装最新版
+ }
+ }
+ else
+ {
+ //ODT 只安装了1个版本,但版本号小于预期版本号,或者还安装了其它版本,
+ //如:ProPlus2016Volume,视为版本不同
+ return InstallState.Diff;
}
-
- //ODT 只安装了1个版本,但版本号和预期版本号不一致,或者还安装了其它版本,
- //如:ProPlus2016Volume,视为版本不同
- return InstallState.Diff;
}
else
{
diff --git a/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs b/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs
index dd8837b..c2c94b5 100644
--- a/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs
+++ b/LKY_OfficeTools/Lib/Lib_OfficeInstall.cs
@@ -21,7 +21,7 @@
using static LKY_OfficeTools.Lib.Lib_AppState;
using static LKY_OfficeTools.Lib.Lib_OfficeClean;
using static LKY_OfficeTools.Lib.Lib_OfficeInfo;
-using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInstall;
+using static LKY_OfficeTools.Lib.Lib_OfficeInfo.OfficeLocalInfo;
namespace LKY_OfficeTools.Lib
{
@@ -35,58 +35,96 @@ internal class Lib_OfficeInstall
///
internal Lib_OfficeInstall()
{
- //被动模式下,不安装,只激活
- if (Current_RunMode == RunMode.Passive)
+
+ try
{
- new Log($"\n * 当前处于被动模式,已跳过 Office 安装流程,直接激活。", ConsoleColor.DarkMagenta);
- new Lib_OfficeActivate();
- return;
- }
+ //版本获取成功时,执行后续操作。
+ if (OfficeNetInfo.OfficeLatestVersion != null)
+ {
+ //判断是否已经安装了当前版本
+ InstallState install_state = GetOfficeState();
+ if (install_state == InstallState.Correct) //已安装最新版,无需下载
+ {
+ new Log($"\n * 当前系统安装了最新 Office 版本,已跳过下载、安装流程。", ConsoleColor.DarkMagenta);
- //下载后,开始安装
- int DownCode = Lib_OfficeDownload.FilesDownload();
+ //开始激活
+ Lib_OfficeActivate.Activating();
+ }
- //判断下载情况
- switch (DownCode)
- {
- case 2:
- //已安装最新版,无需下载安装,直接进入激活模块
- new Lib_OfficeActivate();
- break;
- case 1:
- if (ConflictCheck()) //冲突检查
+ //当不存在 VersionToReport or 其版本与最新版不一致 or 产品ID不一致 or 安装位数与系统不一致时,需要下载新文件。
+ else
{
- //通过进入安装,不通过直接返回false
- if (StartInstall())
+ //被动模式下,如果版本不正确,不会重新安装,因为用户可能已经卸载。
+ if (Current_RunMode == RunMode.Passive)
{
- //安装成功,进入激活程序
- new Lib_OfficeActivate();
+ new Log($"\n × 当前系统未安装最新版本的 Office,激活停止!", ConsoleColor.DarkRed);
+ return;
+ }
+
+ //如果是主动模式,则下载并安装最新版
+ else if (Current_RunMode == RunMode.Manual)
+ {
+ //开始下载,并获得下载结果
+ int DownCode = Lib_OfficeDownload.StartDownload();
+
+ //判断下载情况
+ switch (DownCode)
+ {
+ //下载成功,开始安装
+ case 1:
+ //冲突检查
+ if (ConflictCheck())
+ {
+ //通过进入安装,不通过直接返回false
+ if (StartInstall())
+ {
+ //安装成功,进入激活程序
+ Lib_OfficeActivate.Activating();
+ }
+ else
+ {
+ new Log($"\n × 因 Office 安装失败,已跳过激活流程!", ConsoleColor.DarkRed);
+ break;
+ }
+ }
+ else
+ {
+ new Log($"\n × 无法完成 Office 冲突性检查,已跳过安装流程!", ConsoleColor.DarkRed);
+ break;
+ }
+ break;
+ case 0:
+ new Log($"\n × 未能找到可用的 Office 安装文件,已跳过安装流程!", ConsoleColor.DarkRed);
+ break;
+ case -1:
+ //用户中止了下载
+ new Log($"\n × 用户取消了下载 Office 安装文件,已跳过安装流程!", ConsoleColor.DarkRed);
+ return;
+ }
}
+
+ //其他模式跳出
else
{
- new Log($"\n × 因 Office 安装失败,已跳过激活流程!", ConsoleColor.DarkRed);
- break;
+ new Log($"{Current_RunMode} 模式下,暂不支持下载、安装、激活操作。");
+ return;
}
}
- else
- {
- new Log($"\n × 无法完成 Office 冲突性检查,已跳过安装流程!", ConsoleColor.DarkRed);
- break;
- }
- break;
- case 0:
- new Log($"\n × 未能找到可用的 Office 安装文件,已跳过安装流程!", ConsoleColor.DarkRed);
- break;
- case -1:
- //用户中止了下载,不执行附加内容
- return;
+ }
}
-
- //全部完成后,判断是否成功
- if (Lib_AppState.Current_StageType != Lib_AppState.ProcessStage.Finish_Success)
+ catch (Exception Ex)
+ {
+ new Log($"\n × Office 安装过程中发生异常,已跳过安装流程!", ConsoleColor.DarkRed);
+ new Log(Ex.ToString());
+ }
+ finally
{
- //只要全部流程结束后,不是成功状态(并且没有中断情况),就设置为 失败
- Lib_AppState.Current_StageType = Lib_AppState.ProcessStage.Finish_Fail;
+ //全部完成后,判断是否成功
+ if (Current_StageType != ProcessStage.Finish_Success)
+ {
+ //只要全部流程结束后,不是成功状态(并且没有中断情况),就设置为 失败
+ Current_StageType = ProcessStage.Finish_Fail;
+ }
}
}
@@ -361,7 +399,7 @@ internal static bool StartInstall()
}
///修改为新版本号
- bool isNewVersion = Com_FileOS.XML.SetValue(ODT_path_xml, "Version", OfficeNetVersion.latest_version.ToString());
+ bool isNewVersion = Com_FileOS.XML.SetValue(ODT_path_xml, "Version", OfficeNetInfo.OfficeLatestVersion.ToString());
//检查是否修改成功(版本号)
if (!isNewVersion)
@@ -550,7 +588,7 @@ internal static bool StartInstall()
File.WriteAllText(ODT_path_xml, config);
//开始安装
- new Log($"\n------> 正在安装 Office v{OfficeNetVersion.latest_version} ...", ConsoleColor.DarkCyan);
+ new Log($"\n------> 正在安装 Office v{OfficeNetInfo.OfficeLatestVersion} ...", ConsoleColor.DarkCyan);
///先结束掉可能还在安装的 Office 进程(强制结束,不等待)
Lib_AppSdk.KillAllSdkProcess(KillExe.KillMode.Only_Force);
@@ -562,7 +600,7 @@ internal static bool StartInstall()
//检查是否因配置不正确等导致,意外退出安装
if (install_code == -920921)
{
- new Log($" × Office v{OfficeNetVersion.latest_version} 安装意外结束!", ConsoleColor.DarkRed);
+ new Log($" × Office v{OfficeNetInfo.OfficeLatestVersion} 安装意外结束!", ConsoleColor.DarkRed);
return false;
}
@@ -577,7 +615,7 @@ internal static bool StartInstall()
if (install_state == InstallState.Correct)
{
//安装成功
- new Log($" √ 已完成 Office v{OfficeNetVersion.latest_version} 安装。", ConsoleColor.DarkGreen);
+ new Log($" √ 已完成 Office v{OfficeNetInfo.OfficeLatestVersion} 安装。", ConsoleColor.DarkGreen);
return true;
}
else
@@ -607,7 +645,7 @@ internal static bool StartInstall()
//包含不同版本
if (install_state == InstallState.Diff)
{
- new Log($" × 已安装的 Office 版本与预期的 v{OfficeNetVersion.latest_version} 版本不符!", ConsoleColor.DarkRed);
+ new Log($" × 已安装的 Office 版本与预期的 v{OfficeNetInfo.OfficeLatestVersion} 版本不符!", ConsoleColor.DarkRed);
new Log(install_state); //打点失败注册表记录
return false;
}
@@ -640,34 +678,36 @@ internal static Dictionary ODT_Error
{
get
{
- Dictionary res = new Dictionary();
- res[0] = "安装成功。";
- res[997] = "安装正在进行中。";
- res[13] = "无法验证下载的 Office 部署工具 (ODT) 的签名。";
- res[1460] = "下载 ODT 超时。";
- res[1602] = "用户已取消运行。";
- res[1603] = "未通过任何预检检查。安装 2016 MSI 时尝试安装 SxS。" +
- "当前安装的 Office 与尝试安装的 Office 之间的位不匹配 (例如,在当前安装 64 位版本时尝试安装 32 位版本时。)";
- res[17000] = "未能启动 C2RClient。";
- res[17001] = "未能在 C2RClient 中排队安装方案。";
- res[17002] = "未能完成该过程。可能的原因:" +
+ Dictionary res = new Dictionary
+ {
+ [0] = "安装成功。",
+ [997] = "安装正在进行中。",
+ [13] = "无法验证下载的 Office 部署工具 (ODT) 的签名。",
+ [1460] = "下载 ODT 超时。",
+ [1602] = "用户已取消运行。",
+ [1603] = "未通过任何预检检查。安装 2016 MSI 时尝试安装 SxS。" +
+ "当前安装的 Office 与尝试安装的 Office 之间的位不匹配 (例如,在当前安装 64 位版本时尝试安装 32 位版本时。)",
+ [17000] = "未能启动 C2RClient。",
+ [17001] = "未能在 C2RClient 中排队安装方案。",
+ [17002] = "未能完成该过程。可能的原因:" +
"(1)用户已取消安装" +
"(2)安装已由另一个安装取消" +
"(3)安装期间磁盘空间不足" +
- "(4)未知语言 ID";
- res[17003] = "另一个方案正在运行。";
- res[17004] = "无法完成需要的清理。可能的原因:" +
+ "(4)未知语言 ID",
+ [17003] = "另一个方案正在运行。",
+ [17004] = "无法完成需要的清理。可能的原因:" +
"(1)未知 SKU" +
"(2)CDN 上不存在内容。例如,尝试安装不受支持的 LAP,例如 zh-sg" +
"(3)内容不可用的 CDN 问题" +
"(4)签名检查问题,例如 Office 内容的签名检查失败" +
- "(5)用户已取消";
- res[17005] = "ERROR!SCENARIO CANCELLED AS PLANNED。";
- res[17006] = "通过运行应用阻止更新。";
- res[17007] = "客户端在“删除安装”方案中请求客户端清理。";
- res[17100] = "C2RClient 命令行错误。";
- res[0x80004005] = "ODT 不能用于安装批量许可证。";
- res[0x8000ffff] = "尝试在计算机上没有 C2R Office 时卸载。";
+ "(5)用户已取消",
+ [17005] = "ERROR!SCENARIO CANCELLED AS PLANNED。",
+ [17006] = "通过运行应用阻止更新。",
+ [17007] = "客户端在“删除安装”方案中请求客户端清理。",
+ [17100] = "C2RClient 命令行错误。",
+ [0x80004005] = "ODT 不能用于安装批量许可证。",
+ [0x8000ffff] = "尝试在计算机上没有 C2R Office 时卸载。"
+ };
return res;
}
}
diff --git a/LKY_OfficeTools/OfficeTools.cs b/LKY_OfficeTools/OfficeTools.cs
index 18fcaff..8ed81aa 100644
--- a/LKY_OfficeTools/OfficeTools.cs
+++ b/LKY_OfficeTools/OfficeTools.cs
@@ -107,7 +107,7 @@ private static void Entry()
}
//成功,配置后回收
- Pointing(Current_StageType, true);
+ Pointing(ProcessStage.Finish_Success, true);
//结论
new Log($"\n √ 您已成功完成 {AppAttribute.AppName} 所有流程,感谢您的使用。", ConsoleColor.DarkGreen);
@@ -116,7 +116,7 @@ private static void Entry()
else if (Current_StageType == ProcessStage.Finish_Fail)
{
//失败,先回收,再显示结论
- Pointing(Current_StageType, true);
+ Pointing(ProcessStage.Finish_Fail, true);
//结论
new Log($"\n × 当前部署存在失败环节,您可在稍后重试运行!", ConsoleColor.DarkRed);
diff --git a/LKY_OfficeTools/logo.ico b/LKY_OfficeTools/logo.ico
index ba989d8..a608b4f 100644
Binary files a/LKY_OfficeTools/logo.ico and b/LKY_OfficeTools/logo.ico differ