C#程序 实现如下功能: 1. 读取注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值保存为字符串strShell,strShell的字符串格式举例为"C:\2.4.7460.12546\autostart.exe doctorold.exe"; 2. 将strShell识别字符串中路径的子字符串保存为strPath; 3. 读取当前目录下的DoctorOld.exe文件版本只保留前三段版本号(例:2.4.7460.12546保留2.4.7460)保存为字符串strNewVer; 3. 读取strPath目录下的DoctorOld.exe文件版本只保留前三段版本号(例:2.4.7460.12546保留2.4.7460)保存为字符串strOldVer; 4. 新建"C:\"+strNewVer文件夹,其中包括判断是否存在,进行提示“版本相同是否进行强制更新”,如果强制更新则将旧文件夹进行重命名,重命名规则为在文件夹后加当前时间,将新文件夹路径给strPath赋值; 5. 复制当前目录内所有文件和文件夹至"C:\"+strNewVer; 6. 复制strPath目录下的1.txt、2.txt、3.txt文件至"C:\"+strNewVer直接覆盖; 7. 查找strShell中是否含有“Doctorold.exe”、"Q.exe"、"W.exe",分别存布尔型变量; 8. 如果含有“Doctorold.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe doctorold.exe"; 9. 如果含有“Q.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe Q.exe"; 10. 如果含有“W.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe W.exe"; 11. 读取C:\UpdaterLog.txt,在文件最后行添加:当前日期+时间+“:”+strOldVer+"-->"+strNewVer;

时间: 2023-07-07 19:05:28 浏览: 77
以下是 C# 程序实现该功能的示例代码: ```csharp using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.Win32; namespace Updater { class Program { static void Main(string[] args) { // 读取注册表中的 shell 值 string strShell = Registry.GetValue(@"HKEY_LOCAL_MACHINE\System\Setup", "shell", "") as string; if (string.IsNullOrEmpty(strShell)) { Console.WriteLine("未能读取到注册表中的 shell 值!"); return; } // 提取路径子串 string pattern = @"([A-Za-z]:\\[^\\ ]+)"; MatchCollection matches = Regex.Matches(strShell, pattern); string strPath = matches.Count > 0 ? matches[0].Value : ""; if (string.IsNullOrEmpty(strPath)) { Console.WriteLine("未能从 shell 值中提取到路径!"); return; } // 读取当前目录下 DoctorOld.exe 的版本号 string strNewVer = GetFileVersion("DoctorOld.exe"); // 读取 strPath 目录下 DoctorOld.exe 的版本号 string strOldVer = GetFileVersion(Path.Combine(strPath, "DoctorOld.exe")); // 创建新文件夹 string newFolder = Path.Combine("C:\\", strNewVer); bool forceUpdate = false; if (Directory.Exists(newFolder)) { Console.Write("已存在版本为 {0} 的文件夹,是否强制更新?(Y/N)", strNewVer); forceUpdate = Console.ReadLine().Trim().ToLower() == "y"; if (forceUpdate) { string oldFolder = newFolder + "_" + DateTime.Now.ToString("yyyyMMddHHmmss"); Directory.Move(newFolder, oldFolder); Console.WriteLine("已将旧文件夹重命名为:{0}", oldFolder); } else { Console.WriteLine("未进行强制更新,程序将退出。"); return; } } Directory.CreateDirectory(newFolder); Console.WriteLine("已创建新文件夹:{0}", newFolder); // 复制文件和文件夹 CopyAllFilesAndFolders(Environment.CurrentDirectory, newFolder); // 复制指定文件 string[] filesToCopy = { "1.txt", "2.txt", "3.txt" }; foreach (string file in filesToCopy) { string srcFile = Path.Combine(strPath, file); string destFile = Path.Combine(newFolder, file); if (File.Exists(srcFile)) { File.Copy(srcFile, destFile, true); Console.WriteLine("已复制文件:{0}", file); } } // 修改 shell 值 bool hasDoctorOld = strShell.Contains("Doctorold.exe"); bool hasQ = strShell.Contains("Q.exe"); bool hasW = strShell.Contains("W.exe"); if (hasDoctorOld) { string newShell = string.Format("\"{0}\\autostart.exe\" doctorold.exe", newFolder); Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\Setup", "shell", newShell); Console.WriteLine("已修改 shell 值为:{0}", newShell); } if (hasQ) { string newShell = string.Format("\"{0}\\autostart.exe\" Q.exe", newFolder); Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\Setup", "shell", newShell); Console.WriteLine("已修改 shell 值为:{0}", newShell); } if (hasW) { string newShell = string.Format("\"{0}\\autostart.exe\" W.exe", newFolder); Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\Setup", "shell", newShell); Console.WriteLine("已修改 shell 值为:{0}", newShell); } // 记录更新日志 string logFile = "C:\\UpdaterLog.txt"; string logLine = string.Format("{0}:{1}-->{2}", DateTime.Now.ToString(), strOldVer, strNewVer); File.AppendAllLines(logFile, new[] { logLine }); Console.WriteLine("已记录更新日志:{0}", logLine); } static string GetFileVersion(string filePath) { if (!File.Exists(filePath)) { return ""; } FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(filePath); string version = fvi.FileVersion; string[] parts = version.Split('.'); if (parts.Length >= 3) { version = string.Join(".", parts.Take(3)); } return version; } static void CopyAllFilesAndFolders(string sourceFolder, string destFolder) { DirectoryInfo dir = new DirectoryInfo(sourceFolder); if (!dir.Exists) { return; } foreach (FileInfo file in dir.GetFiles()) { string destFile = Path.Combine(destFolder, file.Name); file.CopyTo(destFile, true); Console.WriteLine("已复制文件:{0}", file.Name); } foreach (DirectoryInfo subdir in dir.GetDirectories()) { string destSubdir = Path.Combine(destFolder, subdir.Name); CopyAllFilesAndFolders(subdir.FullName, destSubdir); } } } } ``` 注意事项: - 运行程序需要管理员权限,否则可能无法修改注册表。 - 由于操作涉及文件复制和重命名等较危险的操作,请谨慎使用该程序。建议在测试环境下进行测试。

相关推荐

C#程序 实现如下功能: 1. 读取注册表SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\下shell的值保存为字符串strShell,strShell的字符串格式举例为"C:\2.4.7460\autostart.exe doctorold.exe"; 2. 将strShell识别字符串中路径(例如C:\2.4.7460\)并保存为strPath; 3. 读取当前目录下的DoctorOld.exe文件版本只保留前三段版本号(例:2.4.7460.12546保留2.4.7460)保存为字符串strNewVer; 4. 读取strPath目录下的DoctorOld.exe文件版本只保留前三段版本号(例:2.4.7460.12546保留2.4.7460)保存为字符串strOldVer; 5. 新建"C:\"+strNewVer文件夹,其中包括判断是否存在,进行提示“版本相同是否进行强制更新”,如果强制更新则将旧文件夹进行重命名,重命名规则为在文件夹后加当前时间,将新文件夹路径给strPath赋值; 6. 复制当前目录内所有文件和文件夹至"C:\"+strNewVer; 7. 复制strPath目录下的1.txt、2.txt、3.txt文件至"C:\"+strNewVer直接覆盖; 8. 查找strShell中是否含有“Doctorold.exe”、"Nurse.exe"、"USVoltDlg.exe"、"Water.exe",分别存布尔型变量; 9. 如果含有“Doctorold.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe doctorold.exe"; 10. 如果含有“Nurse.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe Nurse.exe"; 11. 如果含有“Water.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe Water.exe"; 12. 如果含有“USVoltDlg.exe”则修改注册表HKEY_LOCAL_MACHINE\System\Setup\下shell的值为"C:\"+strNewVer+"autostart.exe USVoltDlg.exe"; 13. 打开“C:\”路径下名为“UpdaterLog.txt”文本文档,在文件最后行添加:当前日期+时间+“:”+strOldVer+"-->"+strNewVer;

最新推荐

recommend-type

C#实现String字符串转化为SQL语句中的In后接的参数详解

在本篇文章中小编给大家分享的是一篇关于C#实现String字符串转化为SQL语句中的In后接的实例内容和代码,需要的朋友们参考下。
recommend-type

C#实现实体类与字符串互相转换的方法

主要介绍了C#实现实体类与字符串互相转换的方法,涉及C#字符串及对象的相互转换技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

C#实现char字符数组与字符串相互转换的方法

主要介绍了C#实现char字符数组与字符串相互转换的方法,结合实例形式简单分析了C#字符数组转字符串及字符串转字符数组的具体实现技巧,需要的朋友可以参考下
recommend-type

C#实现移除字符串末尾指定字符的方法

主要介绍了C#实现移除字符串末尾指定字符的方法,十分常见且重要的一个应用技巧,需要的朋友可以参考下
recommend-type

C#字符串数组转换为整形数组的方法

主要介绍了C#字符串数组转换为整形数组的方法,涉及C#数组遍历与转换的相关技巧,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。