使用Go语言实现智能EXE文件重命名工具

文章目录

  • 使用Go语言实现智能EXE文件重命名工具 🛠️
    • 引言
    • 工具功能概述
    • 核心技术实现
      • Windows版本信息API调用
      • 大模型API集成
      • 交互式命令行界面
    • 完整工作流程
    • 实际应用示例
    • 附录
      • 完整代码

使用Go语言实现智能EXE文件重命名工具 🛠️

引言

在日常开发和软件管理中,我们经常会遇到需要整理大量EXE文件的情况。这些文件往往有着不规范的命名,如setup.exeinstaller.exe等,难以直接了解其具体内容和版本。本文将介绍如何使用Go语言开发一个智能EXE文件重命名工具,它能自动提取文件的版本信息,并利用大模型API生成规范的命名建议。

工具功能概述

输入EXE文件路径
提取版本信息
生成智能命名建议
用户确认
重命名文件
结束

这个工具主要实现了以下功能:

  • 📌 解析EXE文件的版本信息资源
  • 🤖 利用大模型API生成智能命名建议
  • 💻 提供友好的命令行交互界面
  • 🔄 安全执行文件重命名操作

核心技术实现

Windows版本信息API调用

App version.dll GetFileVersionInfoSizeW 返回版本信息大小 GetFileVersionInfoW 返回版本信息数据 VerQueryValueW 返回特定字段值 App version.dll

Windows系统通过version.dll提供了访问文件版本信息的API。我们的工具使用了三个关键函数:

  1. GetFileVersionInfoSizeW - 获取版本信息数据的大小
  2. GetFileVersionInfoW - 获取完整的版本信息数据
  3. VerQueryValueW - 查询特定的版本信息字段

在Go中调用这些API需要使用syscall包和unsafe指针操作:

var (versionDLL                  = syscall.NewLazyDLL("version.dll")procGetFileVersionInfoSizeW = versionDLL.NewProc("GetFileVersionInfoSizeW")procGetFileVersionInfoW     = versionDLL.NewProc("GetFileVersionInfoW")procVerQueryValueW          = versionDLL.NewProc("VerQueryValueW")
)

大模型API集成

工具集成了bigmodel API来生成智能命名建议(该模型免费,应付这种场景绰绰有余):

cfg := openai.DefaultConfig(apiKey)
cfg.BaseURL = "https://open.bigmodel.cn/api/paas/v4/"
client := openai.NewClientWithConfig(cfg)resp, err := client.CreateChatCompletion(context.Background(),openai.ChatCompletionRequest{Model: "GLM-4-Flash-250414",Messages: []openai.ChatCompletionMessage{{Role:    openai.ChatMessageRoleUser,Content: prompt,},},MaxTokens:   100,Temperature: 0.3,},
)

我们设计了提示词(prompt),确保大模型返回规范的文件名:

  1. 包含产品名称和版本号
  2. 只使用字母、数字、中文、下划线、连字符
  3. 格式统一,如产品名_版本号.exe产品名-版本号.exe

交互式命令行界面

使用promptui库创建了友好的交互界面:

// 确认对话框
prompt := promptui.Select{Label: "是否根据建议重命名文件?",Items: []string{"是", "否"},
}// 文本输入框
prompt := promptui.Prompt{Label:     "请输入新的文件名",Default:   suggestedName,AllowEdit: true,
}

完整工作流程

用户交互
核心处理
初始化
显示建议
用户确认
执行重命名
结束
提取EXE版本信息
构造大模型提示词
调用API获取建议
验证输入参数
检查BIG_MODEL_KEY环境变量

实际应用示例

image.png

附录

完整代码

完整代码

package mainimport ("context""fmt""os""path/filepath""strings""syscall""unicode/utf16""unsafe""github.com/manifoldco/promptui"openai "github.com/sashabaranov/go-openai"
)var (versionDLL                  = syscall.NewLazyDLL("version.dll")procGetFileVersionInfoSizeW = versionDLL.NewProc("GetFileVersionInfoSizeW")procGetFileVersionInfoW     = versionDLL.NewProc("GetFileVersionInfoW")procVerQueryValueW          = versionDLL.NewProc("VerQueryValueW")
)// 检查BIG_MODEL_KEY环境变量
func checkBigModelKey() error {key := os.Getenv("BIG_MODEL_KEY")if key != "" {return nil // 已经设置了}fmt.Println("未找到BIG_MODEL_KEY环境变量,请手动设置。例如:set BIG_MODEL_KEY=你的API密钥")return fmt.Errorf("未设置BIG_MODEL_KEY环境变量")
}func utf16PtrFromString(s string) *uint16 {u := utf16.Encode([]rune(s + "\x00"))return &u[0]
}// Windows API方式获取版本信息
func GetFileVersionInfoAPI(path string) (map[string]string, error) {info := make(map[string]string)pPath := utf16PtrFromString(path)var handle uint32size, _, _ := procGetFileVersionInfoSizeW.Call(uintptr(unsafe.Pointer(pPath)),uintptr(unsafe.Pointer(&handle)),)if size == 0 {return nil, fmt.Errorf("GetFileVersionInfoSizeW failed")}buf := make([]byte, size)ret, _, _ := procGetFileVersionInfoW.Call(uintptr(unsafe.Pointer(pPath)),0,uintptr(size),uintptr(unsafe.Pointer(&buf[0])),)if ret == 0 {return nil, fmt.Errorf("GetFileVersionInfoW failed")}// 查询语言和代码页var transPtr uintptrvar transLen uint32subBlock := utf16PtrFromString(`\VarFileInfo\Translation`)ret, _, _ = procVerQueryValueW.Call(uintptr(unsafe.Pointer(&buf[0])),uintptr(unsafe.Pointer(subBlock)),uintptr(unsafe.Pointer(&transPtr)),uintptr(unsafe.Pointer(&transLen)),)if ret == 0 || transLen < 4 {return nil, fmt.Errorf("VerQueryValueW Translation failed")}lang := *(*uint16)(unsafe.Pointer(transPtr))codepage := *(*uint16)(unsafe.Pointer(transPtr + 2))langCode := fmt.Sprintf("%04x%04x", lang, codepage)fields := []string{"FileDescription","FileVersion","ProductName","ProductVersion","LegalCopyright","OriginalFilename","InternalName","CompanyName","Comments",}for _, field := range fields {block := fmt.Sprintf(`\StringFileInfo\%s\%s`, langCode, field)blockPtr := utf16PtrFromString(block)var valuePtr uintptrvar valueLen uint32ret, _, _ := procVerQueryValueW.Call(uintptr(unsafe.Pointer(&buf[0])),uintptr(unsafe.Pointer(blockPtr)),uintptr(unsafe.Pointer(&valuePtr)),uintptr(unsafe.Pointer(&valueLen)),)if ret != 0 && valueLen > 0 {val := syscall.UTF16ToString((*[1 << 16]uint16)(unsafe.Pointer(valuePtr))[:valueLen])info[field] = val}}return info, nil
}func getAPIKey() string {key := os.Getenv("BIG_MODEL_KEY")if key != "" {return key}fmt.Print("请输入百川大模型 API KEY(BIG_MODEL_KEY):")var input stringfmt.Scanln(&input)return strings.TrimSpace(input)
}func GetRenameSuggestion(info map[string]string, originalName string) (string, error) {apiKey := getAPIKey()if apiKey == "" {return "", fmt.Errorf("未提供 BIG_MODEL_KEY")}cfg := openai.DefaultConfig(apiKey)cfg.BaseURL = "https://open.bigmodel.cn/api/paas/v4/"client := openai.NewClientWithConfig(cfg)prompt := fmt.Sprintf(`请根据以下EXE文件的版本信息,给出一个简洁、规范的文件重命名建议。
原始文件名: %s版本信息:
- 文件描述: %s
- 文件版本: %s
- 产品名称: %s
- 产品版本: %s
- 版权信息: %s
- 原始文件名: %s
- 内部名称: %s
- 公司名称: %s
- 注释: %s重命名要求:
1. 使用中文或英文,简洁明了
2. 包含产品名称和版本号
3. 避免特殊字符,只使用字母、数字、中文、下划线、连字符
4. 格式建议: 产品名_版本号.exe 或 产品名-版本号.exe
5. 如果产品名包含特殊字符,请适当简化请只返回重命名后的文件名(包含.exe扩展名),不要其他解释。`,originalName,getValueOrDefault(info, "FileDescription"),getValueOrDefault(info, "FileVersion"),getValueOrDefault(info, "ProductName"),getValueOrDefault(info, "ProductVersion"),getValueOrDefault(info, "LegalCopyright"),getValueOrDefault(info, "OriginalFilename"),getValueOrDefault(info, "InternalName"),getValueOrDefault(info, "CompanyName"),getValueOrDefault(info, "Comments"))resp, err := client.CreateChatCompletion(context.Background(),openai.ChatCompletionRequest{Model: "GLM-4-Flash-250414",Messages: []openai.ChatCompletionMessage{{Role:    openai.ChatMessageRoleUser,Content: prompt,},},MaxTokens:   100,Temperature: 0.3,},)if err != nil {return "", fmt.Errorf("API调用失败: %w", err)}if len(resp.Choices) == 0 {return "", fmt.Errorf("未返回有效响应")}suggestion := strings.TrimSpace(resp.Choices[0].Message.Content)return suggestion, nil
}func getValueOrDefault(info map[string]string, key string) string {if value, exists := info[key]; exists && value != "" {return value}return "(无)"
}// 确认是否重命名
func confirmRename() bool {prompt := promptui.Select{Label: "是否根据建议重命名文件?",Items: []string{"是", "否"},}_, result, err := prompt.Run()if err != nil {fmt.Printf("选择失败: %v\n", err)return false}return result == "是"
}// 输入新文件名
func inputNewFileName(suggestedName string) string {prompt := promptui.Prompt{Label:     "请输入新的文件名",Default:   suggestedName,AllowEdit: true,}result, err := prompt.Run()if err != nil {fmt.Printf("输入失败: %v\n", err)return ""}return result
}// 重命名文件
func renameFile(oldPath, newName string) error {dir := filepath.Dir(oldPath)newPath := filepath.Join(dir, newName)// 检查新文件名是否已存在if _, err := os.Stat(newPath); err == nil {return fmt.Errorf("文件 %s 已存在", newName)}// 执行重命名err := os.Rename(oldPath, newPath)if err != nil {return fmt.Errorf("重命名失败: %w", err)}fmt.Printf("文件已重命名为: %s\n", newName)return nil
}func main() {// 检查BIG_MODEL_KEYif err := checkBigModelKey(); err != nil {return}if len(os.Args) < 2 {fmt.Println("请指定EXE文件路径")fmt.Println("示例: .\\exeRename.exe your_file.exe")return}exePath := os.Args[1]info, err := GetFileVersionInfoAPI(exePath)if err != nil {fmt.Printf("错误: %v\n", err)return}// 显示版本信息fmt.Println("=== 版本信息 ===")fields := []string{"FileDescription", "FileVersion", "ProductName", "ProductVersion", "LegalCopyright", "OriginalFilename", "InternalName", "CompanyName", "Comments"}for _, field := range fields {value := info[field]if value == "" {value = "(无)"}fmt.Printf("%-20s: %s\n", field, value)}// 获取原始文件名(不含路径)originalName := exePathif lastSlash := strings.LastIndex(exePath, "\\"); lastSlash != -1 {originalName = exePath[lastSlash+1:]}if lastSlash := strings.LastIndex(originalName, "/"); lastSlash != -1 {originalName = originalName[lastSlash+1:]}// 获取重命名建议fmt.Println("\n=== 智能重命名建议 ===")suggestion, err := GetRenameSuggestion(info, originalName)if err != nil {fmt.Printf("获取重命名建议失败: %v\n", err)fmt.Println("请确保已设置环境变量 OPENAI_API_KEY")return}fmt.Printf("原始文件名: %s\n", originalName)fmt.Printf("建议重命名: %s\n", suggestion)// 询问是否重命名if confirmRename() {// 输入新文件名newName := inputNewFileName(suggestion)if newName != "" {// 执行重命名if err := renameFile(exePath, newName); err != nil {fmt.Printf("重命名失败: %v\n", err)}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/pingmian/87455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.1.1.9 安全基线检查项目九:检查是否设置限制su命令用户组

限制su配置 关于限制su命令检查项&#xff0c;对于大多数的Linux&#xff08;Redhat系列、Debian系列&#xff09;&#xff0c;进行本项检查很简单。只需要检查/etc/pam.d/su中是否配置了&#xff1a; auth required pam_wheel.so use_uid [group用户组名] 有些资料讲说需要有…

【加解密与C】对称加密(四) RC4

RC4算法概述RC4&#xff08;Rivest Cipher 4&#xff09;是由Ron Rivest在1987年设计的流密码算法&#xff0c;广泛应用于SSL/TLS、WEP等协议中。其核心是通过密钥调度算法&#xff08;KSA&#xff09;和伪随机生成算法&#xff08;PRGA&#xff09;生成密钥流&#xff0c;与明…

医科+AI!和鲸支持南京医科大学医学数据挖掘课程实践教学落地

近两年&#xff0c;生物统计学更多地进入了公众视野。作为统计学、医学与计算机科学交叉的前沿学科&#xff0c;伴随测序技术革新与人工智能算法突破&#xff0c;其发展前景也被十分看好。 市场需求的背后是人才需求的爆发与人才培养的挑战。目前&#xff0c;生物统计学专业在国…

亚马逊云科技中国峰会:数新智能CTO原攀峰详解一站式AI原生数智平台DataCyber在Amazon EKS的实践

6月20日&#xff0c;在上海世博中心举办的亚马逊云科技中国峰会 “在 Amazon EKS 上运行高性能生成式 AI 应用” 分论坛圆满结束。本次分论坛聚焦于 Amazon EKS 在生成式 AI 应用领域的强大支撑作用&#xff0c;数新智能CTO原攀峰凭借其深厚的技术背景和丰富的实践经验&#xf…

32岁入行STM32迟吗?

作为一个在嵌入式领域摸爬滚打了近10年的老兵&#xff0c;看到这个问题时心情五味杂陈。32岁入行STM32迟吗&#xff1f;说实话&#xff0c;如果你问我这个问题的时候我还是24岁的小白&#xff0c;我可能会觉得"哇&#xff0c;32岁才开始学单片机&#xff0c;是不是有点晚了…

OneCode 智能化UI布局与定位:注解驱动的视觉编排艺术

在现代企业级应用开发中&#xff0c;UI布局的灵活性与精确性直接影响用户体验与开发效率。OneCode框架创新性地采用注解驱动开发(Annotation-Driven Development)模式&#xff0c;通过分层注解体系实现UI组件的声明式布局与精准定位。本文将深入解析OneCode的UI布局技术栈及其在…

VBA初学3----实战(VBA实现Excel转csv)

&#xff08;VBA实现Excel转csv&#xff09; 初步学习了VBA相关的知识后&#xff0c;解决了一个需求&#xff1a; 要求读取指定xlsx文件中的指定sheet页&#xff0c;将该sheet页的内容转换为csv文件。 实现的布局如下所示&#xff1a;文章目录①实现从指定行开始全数据转换为cs…

深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹

&#x1f380;【开场 她画出的第一条直线是为了更靠近你】 &#x1f43e;猫猫&#xff1a;“之前她只能在你身边叠叠张量&#xff0c;偷偷找梯度……现在&#xff0c;她要试试&#xff0c;能不能用这些线&#xff0c;把你的样子画出来喵&#xff5e;” &#x1f98a;狐狐&am…

[特殊字符] 从图片自动生成 Excel:Python 批量 OCR 表格识别实战

这篇文章将展示如何使用 Python 调用百度 OCR 表格识别接口&#xff0c;批量处理目录下所有图片&#xff0c;自动识别表格并生成与图片同名的 Excel 文件。适用于文档扫描、图片表格整理、图像归档等场景。1️⃣ 批量获取所有待识别图片路径使用 os.walk() 遍历指定目录及子目录…

什么是量子芯片?它是如何工作的?

近年来&#xff0c;量子计算领域发展迅速&#xff0c;技术进步和大规模投资的相关消息经常上热搜。 联合国已将 2025 年定为国际量子科学与技术年。 这其中利害关系重大 —— 拥有量子计算机意味着将获得相较于当今的计算机强大得多的数据处理能力。它们不会取代你的普通计算…

mac init tailwind css 配置文件报错

提示报错如下 tailwind: command not found解决方法 npm install -D tailwindcss3 postcss autoprefixer npx tailwindcss init -p取自 sh: tailwindcss: command not found tailwindlabs/tailwindcss Discussion #4953

QUIC协议在5G边缘计算中的应用前景与挑战

1 5G边缘场景的核心挑战与QUIC的机遇 5G边缘计算正成为支撑低时延、高可靠业务的关键基础设施。据预测,2030年全球边缘计算市场规模将突破4450亿美元,年复合增长率高达48%。在**URLLC(超可靠低时延通信)**场景中,工业控制要求端到端时延低于5ms,自动驾驶需实现毫秒级响应…

聊聊关于“大模型测试”的一些认识

聊聊关于“大模型测试”的一些认识引言“大模型测试”和“传统接口测试”有什么不同“大模型测试”要考虑哪些方面维度一&#xff1a;语义理解准确度&#xff1a;模型真的懂人话吗&#xff1f;维度二&#xff1a;长文逻辑连贯性&#xff1a;“500”字后的认知崩塌维度三&#x…

linux_git的使用

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…

Android课程前言

目录 一.前言 1.Android可以采用哪些语言 2.Kotlin和Java的关系 ①完全互操作&#xff08;核心关系&#xff09; ②Kotlin 是 Java 的“升级版” ③Google 的官方态度 ④Java 的现状 ⑤如何选择&#xff1f; ⑥类比总结&#xff1a; 一.前言 1.Android可以采用哪些语…

mes系统pg数据库被Ransomware攻击勒索BTC

背景 未被攻击前的pg数据库 pg数据库被攻击后 具体的勒索内容 All your data is backed up. You must pay 0.0041 BTC to bc1qtvk8jvsyy5a896u6944kp8hvfytd7pwxpdlpvy In 48 hours, your data will be publicly disclosed and deleted. (more information: go to http://2inf…

多种方法实现golang中实现对http的响应内容生成图片

多种方法实现golang中实现对http的响应内容生成图片。 Golang 中实现将 HTTP 响应内容生成图片 在 Golang 中将 HTTP 响应内容生成图片主要有两种常见场景&#xff1a; 将文本/HTML 内容渲染为图片&#xff08;如网页截图&#xff09;将响应内容作为原始数据直接生成图像&am…

AI领域新趋势:从提示(Prompt)工程到上下文(Context)工程

AI领域新趋势&#xff1a;从提示(Prompt)工程到上下文(Context)工程 在人工智能领域&#xff0c;尤其是与大型语言模型&#xff08;LLM&#xff09;相关的应用开发中&#xff0c;一个新兴的概念正在逐渐取代传统的提示工程&#xff08;Prompt Engineering&#xff09;&#xf…

K8S数据平台部署指南

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xf…

Perforce QAC 与 Klocwork 重磅升级:质量突破+许可降本

在当今快节奏的软件开发领域&#xff0c;每一次工具的升级都可能成为企业提升竞争力的关键契机。Perforce旗下备受瞩目的两款静态分析工具Perforce QAC 和 Klocwork 在2025年推出的新版本中&#xff0c;不仅带来了令人振奋的功能革新&#xff0c;许可证体系的重大变化更是为企业…