简介:AutoIt v3 是一款采用 BASIC 风格语法的 Windows GUI 自动化脚本语言,此绿色汉化特别版面向测试工程师、运维人员和脚本爱好者,可解决模拟击键、鼠标移动、窗口/控件操作、注册表维护以及批量配置 PC 等重复性任务。压缩包共 194 个文件,整体大小仅 6.44MB,主体为 129 个 au3 脚本示例,辅以 properties 配置、lua 脚本、exe 辅助工具、api 接口文件与 sciteconfig 编辑器配置,同时附带完整 chm 帮助文档与 AutoItX 动态链接库,便于离线查阅与调用。包内脚本覆盖变量、用户函数、循环、复杂表达式等新版语法,读者可参考示例编写窗口自动化、剪贴板读写、进程启动和运行 DOS 程序等任务;结合 Aut2Exe 还能将脚本编译成独立 exe,在没有安装 AutoIt 的机器上直接运行。目前已有 863 人学习浏览,绿色免安装、免依赖 DLL、不写注册表,使其解压即用,适合零基础入门、批量部署及现场快速验证,是一份经典且实用的自动化利器。
1. 为什么 AutoIt(AU3) V3.3.6.1 绿色汉化特别版仍是 Windows 自动化绕不开的选择
很多驻场运维和测试手里都有这么一堆活:每天打开某个老系统,填表单、点按钮、等弹窗、导数据。流程固定,但没人愿意手动重复,而现场机器往往装不了 Python,也没法为一个小需求申请开发环境。我刚入行那会儿也遇到同样的问题,最后把一个 AutoIt(AU3) V3.3.6.1 绿色汉化特别版塞进 U 盘,在客户机器上解压即用,靠十几行脚本把重复点击的活全干了。这个版本之所以值得写,是因为它把解释器、SciTE 编辑器、编译工具和窗口调试工具全部打包在一个绿色目录里,不写注册表、不装服务,适合当作随取随用的自动化工具包。这篇文章不是复述官方手册,而是讲清楚这个版本怎么搭环境、怎么写脚本、参数怎么调,以及绿色汉化版最常见的几个坑,让新手能按步骤跑通,熟手能直接拿去交付。
2. 拆解绿色汉化版:目录结构、SciTE 配置与最小可运行脚本
2.1 绿色汉化版和官方安装版差在哪:先看目录再谈功能
AutoIt 的运行机制可以拆成四个角色:AutoIt3.exe 是脚本解释器,负责逐行读取 AU3 文件并执行;Include 目录里存放的是标准函数库,比如后面会用到的常量定义文件;Aut2Exe 负责把脚本编译成独立 EXE;AU3Info 则是老用户最熟悉的“窗口信息工具”,用来查看目标窗口的标题、类名和控件标识。官方安装版会把这些组件写进系统目录,并在注册表里建立文件关联和右键菜单;绿色汉化版则把所有东西装进同一个目录,靠脚本自身环境变量工作,解压到哪就能在哪跑。
我拿到的这类汉化特别版,界面上最常见的变化是 SciTE 编辑器和部分编译器对话框变成了中文,脚本语法和函数名没有变。这意味着你之前看过的任何 AutoIt 教程里的代码,在这个版本里仍然能运行,不必担心“汉化版是不是改了语法”。需要注意的反而是另一个问题:汉化版往往基于当年某个稳定版本制作,V3.3.6.1 属于较早期的 3.3.6 系列,它没有后续版本里更严格的窗口匹配语法,也没有那么多新函数,但核心操作反而更收敛,适合做固定环境下的交付工具。
部署时我会把压缩包解压到一个纯英文路径,比如 C:\AutoIt3 或 D:\Tools\AutoIt3。汉化版自带中文资源,但 SciTE 的配置解析和 Aut2Exe 的输出路径对中文路径支持并不好,我在项目里见过因为路径带中文导致编译失败的案例,报错信息是“无法创建输出文件”,实际上就是路径编码问题。把目录名改成英文能省掉一大类玄学错误。第一次运行时如果是 Vista 以上系统,建议右键 AutoIt3.exe 选择“以管理员身份运行”,因为脚本要读取全局窗口消息,权限不够时句柄获取会失败。
注意:绿色版没有注册 .au3 文件关联,双击脚本通常打不开编辑器。养成先打开 SciTE 再从编辑器里打开脚本的习惯,或者直接用命令行调用 AutoIt3.exe。
2.2 免安装跑通第一个 AU3 脚本:编辑器的三个关键设置
绿色版通常自带 SciTE 编辑器,这是 AutoIt 社区最常见的编辑环境。汉化版里菜单基本是中文,新手很快能找到运行脚本的入口,但有三处设置我每次部署都会手动确认一遍,因为精简版或者二次打包版容易把这些细节裁掉。
第一处是语法着色。打开 SciTE 后随便写一行 MsgBox,如果函数名没有变成蓝色或者其他高亮颜色,说明编辑器没有加载 AutoIt 语法配置。语法着色不影响运行,但直接影响查错效率,少了高亮等于失去了一双眼睛。
第二处是运行快捷键。确认 F5 能运行当前脚本,F7 能编译。按下 F5 没有反应时,去“工具”菜单里看看命令是否指向了 SciTE4AutoIt3 的 AutoIt3 运行器。有些绿色版把这条命令丢了,脚本只能在命令行里手敲路径执行,调试效率会低很多。
第三处是默认编码。V3.3.6.1 年代的 SciTE 默认可能保存为 ANSI,而后续习惯里为了兼容中文又常用 UTF-8。AutoIt 3.3.6.1 解释器对脚本文件编码的判断比较宽松,但编译器和 SciTE 之间的交互偶尔会因为 BOM 出问题。我一般会在“文件”菜单里把默认编码固定为 UTF-8 without BOM,或者继续用 ANSI,同一个项目里绝不混用两种编码。
配置好之后写第一个最小脚本,保存为 hello.au3,内容如下:
; 最小验证脚本:确认解释器和函数库都能正常加载 #include <MsgBoxConstants.au3> MsgBox(0, "验证", "AutoIt 3.3.6.1 已正常运行")按 F5 运行后,屏幕会弹出一个标题为“验证”的对话框。这段代码里 #include 引入的是消息框常量定义文件,它本身并不是 MsgBox 运行的必要条件,但我故意写上它,是为了验证 Include 目录有没有被 SciTE 正确引用。如果 Include 路径配错了,脚本会在第一行直接报错,这样能在动手写正式逻辑之前就发现环境问题。第二行 MsgBox 的三个参数分别代表按钮类型、标题、正文内容,第一个参数 0 表示只显示“确定”按钮,如果改成 1 会出现“确定”和“取消”,方便后续用返回值判断用户行为。
除了在 SciTE 里按 F5,也可以直接在命令行里运行:
"C:\AutoIt3\AutoIt3.exe" "C:\AutoIt3\scripts\hello.au3"AutoIt3.exe 后面可以跟一个可选参数作为脚本参数,参数在脚本内部通过 $CmdLine 数组读取。命令行方式在计划任务和远程调用场景里更实用,因为不需要任何手工交互。脚本内部获取自身路径也有专用宏,比如 @ScriptDir 返回当前脚本所在目录,日志文件路径一般都会用它拼接。
3. 用 AU3 写第一个能落地的自动化脚本:窗口等待、控件操作与按键模拟
3.1 窗口识别方式:WinWait 与 WinActivate 的正确使用顺序
新手写 AutoIt 脚本,最容易踩的坑就是靠 Sleep 等窗口。比如打开软件之后直接 Sleep(3000),然后去操作控件。这个写法在小脚本里偶尔能跑通,但只要目标软件启动慢一点,脚本就会在窗口还没出现时执行点击,导致整个流程断掉。AutoIt 的成熟写法是用 WinWait 系列函数替代固定睡眠。
AutoIt 对窗口的识别主要依赖窗口标题和类名。标题是用户看得到的文字,容易理解,但同一个软件不同状态下标题会变;类名则稳定,但可读性差。定位字符串的基本格式是 [CLASS:Notepad],也可以直接用标题文本。我习惯先写一段等待窗口的标准套路:
; 等待记事本窗口出现,最多等 10 秒 Local $sWin = "[CLASS:Notepad]" WinWait($sWin, "", 10) ; 窗口出现后激活它,让它进入前台 WinActivate($sWin) WinWaitActive($sWin, "", 5)WinWait 会暂停脚本,不断向系统查询窗口是否已创建,直到窗口出现或超时。返回 1 表示窗口已出现,返回 0 表示超时。WinActivate 把窗口带到前台,WinWaitActive 再等待窗口确实进入激活状态。为什么要分三步?因为如果窗口还没创建就调用 WinActivate,系统拿到的是一个无效句柄,操作会被静默丢弃。加上 WinWaitActive 还有一层意义:它确保窗口真的完成了加载,避免控件还没初始化就乱点。
窗口定位字符串的写法有很多组合,常用的集中在下面这几种:
| 写法 | 示例 | 适用场景 |
|---|---|---|
| 标题精确匹配 | "保存文件 - 记事本" | 标题固定不变的窗口 |
| 标题模糊匹配 | "保存文件" | 文件名变化导致标题变化 |
| 类名匹配 | "[CLASS:Notepad]" | 标题经常变化的场景 |
| 标题正则匹配 | "[REGEXPTITLE:保存文件.*]" | 多个相似窗口需要区分 |
V3.3.6.1 已经支持正则匹配,但我建议新手尽量少用。正则写错时不会立刻报错,而是匹配不到窗口后超时,排查问题要花的时间比多写一个 If 判断长得多。类名匹配在自动化里最常用,因为很多软件的标题包含动态内容,而类名相对稳定。
3.2 控件操作三件套:ControlFocus、ControlClick、ControlSetText
窗口出现之后,接下来的核心动作是操作控件。AutoIt 提供了一套不走键盘模拟的直接控件操作函数,它们的原理是通过窗口消息直接把操作发给目标控件,不需要目标窗口处于前台。这套函数在脚本被最小化或者锁屏时也能工作,这是它与按键模拟最关键的差别,也是后台自动化的基础。
先看一个给记事本写入文本的例子:
; 给记事本编辑区写入一段文字 ControlFocus("无标题 - 记事本", "", "Edit1") ControlSetText("无标题 - 记事本", "", "Edit1", "这段文字绕过了键盘模拟") ; 在对话框中点击“确定”按钮 ControlClick("记事本", "", "[CLASS:Button; TEXT:确定]")ControlFocus 的作用是把焦点给到指定控件,等价于人工点了一下输入框;ControlSetText 直接向控件写入文本,不产生真实按键;ControlClick 向按钮发送点击消息。三个函数里最重要的参数是第三个参数“控件标识”,也就是 ControlID。绿色版自带 AU3Info 工具就是干这个的:把十字线拖到目标控件上,工具会列出窗口的类名、实例号以及控件的 ClassnameNN,例如 Edit1 表示窗口里第一个 Edit 类控件,Button1 表示第一个按钮。
控件标识有两种常用写法。第一种是直接写 ClassnameNN,例如 Edit1,优点是简单,缺点是界面布局一变这个编号就容易失效。第二种是高级描述符,例如 [CLASS:Button; TEXT:确定],它同时匹配控件类名和显示文本,稳定性更好。我在实际项目里优先使用带 TEXT 的描述符,因为文本比序号更接近业务语义,后续改脚本时也更直观。
需要注意,ControlSetText 在某些自绘控件上是无效的,自绘控件不会响应标准的 WM_SETTEXT 消息。这时候没有更好的办法,只能退回到 Send 模拟键盘输入。判断一个控件是不是自绘控件,用 AU3Info 看控件类型是最快的方式:如果显示的是 DirectUIHWND 或类似的自绘容器类名,直接控件操作通常会失败。
3.3 Send 按键模拟的参数细节与常见误用
直接控件操作能覆盖大部分原生窗口,但总有一些窗口控件树里看不到按钮,或者目标程序是游戏界面、网页全屏等特殊情况,这时候只能用 Send 模拟真实按键。Send 的语法是 AutoIt 的老传统,几个修饰符对应键盘上的组合键:
; 发送快捷键 Ctrl+S 保存当前文件 Send("^s") ; 发送 Alt+F 打开文件菜单 Send("!f") ; 发送回车和 Tab 键 Send("{ENTER}{TAB}") ; 发送一段普通文本 Send("autoit 3.3.6.1") ; 提高发送速度,不完全等待上一条按键处理完 Send("abc", 1)AutoIt 的约定里,^ 表示 Ctrl,! 表示 Alt,+ 表示 Shift,# 表示 Win 键。如果想发送字面上的 ^ 字符,需要写成 {{^}。这个转义规则被很多人忽略,导致脚本发送的文本总是不完整。Send 默认会等待上一条按键被目标程序处理完再发送下一条,避免丢键;如果脚本里连续 Send 大量内容,可以给第二个参数传 1 跳过等待。但我一般只在发送纯英文短文本时这么用,中文长文本走 Send 仍有可能出现乱码,更稳妥的方案是先把文本放进剪贴板,再发送 Ctrl+V。
Send 最大的坑在于它作用在当前焦点窗口上。如果只调用了 WinActivate 而没有把焦点给到具体输入框,Send 出来的字符可能落在窗口的其他位置。所以 Send 之前要先 ControlFocus,或者先发一个 Tab 把焦点切到目标控件。另一个常见问题是输入法状态:中文输入法开启时,Send 发送的字母可能被输入法截获,最终写入的是英文字母或者拼音。老练的脚本会在 Send 中文之前先发送一次 Shift 切换输入法,或者在脚本开头用注册表操作锁定英文输入法,但那是另一个层面的工程了。
4. 流程控制与数据处理:把脚本从“能用”推到“复用得舒服”
4.1 变量、循环和条件判断在自动化脚本里的实际位置
脚本一旦要处理真实业务,就不可能是一条直线。窗口标题会变,按钮文字会变,上一步的结果会影响下一步怎么走,所以变量和流程控制是不可避免的。AutoIt 的变量语法在 V3.3.6.1 已经稳定,不需要额外引用模块就能使用:
; 定义局部变量 Local $sTitle = "登录窗口" Local $iCount = 0 ; 字符串拼接 Local $sFull = $sTitle & " - " & "用户" ; 条件判断 If WinExists($sFull) Then WinActivate($sFull) Else MsgBox(16, "错误", "窗口未出现") EndIfAutoIt 用 & 符号做字符串拼接,变量名不区分大小写,前缀只是代码习惯。真正要记住的是它的块结构语法:If 必须以 EndIf 结束,For 循环以 Next 结束,While 循环以 WEnd 结束。这几种配对结构很容易嵌套错乱,尤其当脚本写到上百行时,少一个 EndIf 会让解释器报出奇怪的行号。V3.3.6.1 的错误定位能力不算强,报错的位置往往是整个结构块的结尾而不是真正出错的那一行,所以我写脚本时坚持在 If 和 EndIf 之间加上缩进,靠代码格式减少配对错误。
For 循环适合重复点击和批量文件处理,比如一个表格要翻 10 页:
For $i = 1 To 10 ControlClick("订单确认", "", "[CLASS:Button; TEXT:下一页]") ; 等业务处理完成再点下一页 Sleep(800) Next这里的 Sleep 是必要的,因为页面切换需要网络请求时间,但固定等待时间仍然是个隐患。更稳的做法是在循环里等待下一页的某个标志控件出现,方法就是把 Sleep 换成 WinWait 和 ControlWait 的组合。自动化脚本的真正难点就在这里:你要判断的不是代码执行到哪里,而是业务进行到哪里。
4.2 处理弹窗和异常分支:While 循环配合 WinExists 的稳定写法
真实业务里弹窗的出现时机往往不确定。比如一个数据导出功能,有时候 3 秒弹出完成提示,有时候要等 30 秒,后台还会因为数据量大小随时弹一个警告框。在这种场景里,最稳定的写法是轮询等待,也就是循环检查窗口是否存在,直到出现或超时。
; 每隔 1 秒检查一次“导出完成”弹窗,最多检查 30 次 Local $iWait = 0 While $iWait < 30 If WinExists("导出完成", "") Then ControlClick("导出完成", "", "[CLASS:Button; TEXT:确定]") ExitLoop EndIf Sleep(1000) $iWait = $iWait + 1 WEnd ; 检查是否超时 If $iWait >= 30 Then MsgBox(48, "提示", "30 秒内未等到导出完成弹窗") EndIf这个写法的核心是 WinExists 返回真值后立即处理并跳出循环,不再继续空等。退出循环之后再检查 $iWait 是否达到上限,就能区分“正常完成”和“超时失败”两条路径。把超时报出来而不是让脚本继续往下执行,是个很重要的习惯:后续动作如果依赖导出结果,弹窗没出现时继续操作只会把错误放大。
从这个例子能看出 AutoIt 流程控制的思维模式:窗口是程序的状态信号,窗口存在与否就是业务成败的判断标准。拿到哪个窗口标题就做哪个分支的处理,比维护一堆布尔变量直观得多。唯一的风险是窗口标题会随系统语言或软件版本变化,所以脚本交付时最好把标题字符串收敛到常量区,用一个变量统一管理,换环境时只改一处。
5. 避坑指南:绿色汉化版最常见的 5 个翻车现场
5.1 现象:SciTE 提示无法打开配置文件,脚本语法着色全部丢失
我在一台新电脑上解压绿色汉化版后,第一次打开 .au3 文件发现所有代码都是黑色,没有任何高亮。按 F5 运行脚本时,SciTE 弹了一个“无法打开配置文件”的提示,然后就没有动静了。
排查下来是精简版把 SciTE 的全局配置文件剥离了,也可能是解压路径里包含中文,导致 SciTE 找不到 SciTEGlobal.properties。解决的思路分两步:先检查 SciTE 目录下有没有 properties 文件夹,里面有没有 AutoIt 相关的配置文件;如果没有,从这个绿色版压缩包里重新解压一份覆盖。如果实在找不到配置,可以绕开 SciTE,直接用记事本或者任何代码编辑器写脚本,再通过命令行运行。语法着色是编辑体验问题,不是运行必需,别让它卡住整体进度。
5.2 现象:编译后的 EXE 弹窗中文乱码,ControlSetText 写入的文本也是乱码
有一次我写好一个自动化填写表单的脚本,在本机 SciTE 里运行一切正常,编译成 EXE 放到另一台机器上,弹窗里的中文变成了“锟斤拷”之类的乱码,控制输入框写入的文本在目标程序里也显示成乱码。
这个问题的根源是脚本文件保存编码和解释器预期不一致。V3.3.6.1 时代的解释器默认按 ANSI 读取脚本文件,而新一点的编辑器默认保存成 UTF-8。当脚本里有中文字符串时,UTF-8 文件被按 ANSI 读,字符串就全乱了。解决办法是统一编码:在 SciTE 里把脚本保存为 ANSI,或者保存为带 BOM 的 UTF-8。关键是同一个脚本里不要混用,也不要交给同事后让他换一种编码保存。判断脚本当前是什么编码也很简单:用 SciTE 打开后看右下角状态栏的编码标识,或者在菜单里选“另存为”,看默认给出的编码项。
5.3 现象:64 位系统上 WinWait 一直超时,窗口句柄拿不到
在 64 位 Windows 10 上,我用绿色版运行一个脚本,等待某款 64 位应用程序的窗口出现,结果 WinWait 一直超时,换成 32 位程序反而正常。这个现象会让很多人误以为 AutoIt 不支持 64 位程序,其实不然。
AutoIt3.exe 默认是 32 位进程,但它通过 Windows 消息机制操作窗口,本身能跨位数访问 64 位程序的窗口。真正的问题通常是权限不匹配:目标窗口以管理员权限运行,而 AutoIt3.exe 是普通权限,系统会拒绝普通权限进程获取那个窗口的完整句柄。解决方法是让脚本提升到管理员权限,最简单的就是把脚本第一行加上 #RequireAdmin,它会要求 UAC 弹窗提权。如果用命令行方式编译 EXE,还可以通过编译参数把管理员权限声明直接嵌进 EXE 的 manifest 里。加了 #RequireAdmin 之后,从计划任务启动脚本时也要把任务设置成“使用最高权限运行”,否则计划任务执行的进程仍然是普通权限。
5.4 现象:编译出来的 EXE 换台电脑双击无反应,连报错都没有
这是交付时最容易出现的尴尬。脚本在本机编译后运行一切正常,复制到同事电脑上双击,进程一闪而过或者完全没反应。我先怀疑脚本逻辑,后来发现是架构选错了。
Aut2Exe 编译时默认会生成与本机架构一致的 EXE。如果开发机是 64 位,编译器可能会生成 64 位版本,而目标机器虽然是 64 位操作系统,但业务软件是 32 位,两个进程在某些窗口消息交互上就是会出问题。解决方式很直接:编译时在 Aut2Exe 的选项里把目标 CPU 架构固定为 x86,这样生成的 EXE 在任何 Windows 版本上都能运行,也避免了很多第三方工具库的位数限制。另一个容易忽略的点是杀毒软件拦截,详见下一条。
5.5 现象:汉化版脚本被安全软件当成木马删除
我遇到过最憋屈的坑:脚本编译完成,测试通过,正准备提交给运维,结果 Windows Defender 直接把这个 EXE 隔离了,连绿色版解压时也被拦截过。AutoIt 编译出的 EXE 本质上是把脚本数据捆绑进解释器外壳,加壳特征明显,很多安全策略会把“可执行脚本壳”视为潜在风险。汉化版比官方版更进一步,它经过了二次打包,威胁情报库里的指纹匹配度低,误报概率更高。
这个问题没有一劳永逸的解法。正规做法是把脚本和编译出的 EXE 提交给公司的安全团队,说明这是 AutoIt 脚本编译产物,申请加入白名单。个人使用时可以暂时关闭实时防护再编译,但交付给外部环境时必须走申请流程。我的建议是,所有用 AutoIt 编译的 EXE 都在代码里写清楚业务用途,编译时不加壳、不加密,保持特征干净,这能降低误报率。遇到杀毒误报别硬顶着换杀毒软件,那解决不了本质问题。
6. 进阶用法:把脚本编译成 EXE 挂进计划任务做无人值守
6.1 用 Aut2Exe 命令行编译:参数选择与验证
脚本调试稳定后,下一件事通常是交付成独立 EXE。绿色版里的 Aut2Exe 支持命令行编译,这个方式比打开图形界面点按钮更可重复,也方便写进自己的打包工具里。我常用的编译命令是:
"C:\AutoIt3\Aut2Exe\Aut2Exe.exe" /in "C:\scripts\daily_report.au3" /out "C:\scripts\daily_report.exe" /x86/in 参数指定 AU3 源文件路径,/out 指定输出 EXE 路径,/x86 强制生成 32 位可执行文件。编译完成后还要做两个验证:一是直接双击运行,确认弹窗、控件操作都正常;二是在命令行里用 /? 或者手动启动一次,观察退出码是不是 0。如果脚本里用了 #RequireAdmin,编译出来的 EXE 会在启动时弹 UAC 提权框,这个行为在无人值守任务里必须提前考虑,否则计划任务会因为无法弹窗而失败。
6.2 计划任务调度:以 SYSTEM 运行与 UAC 的关系
编译好的 EXE 要真正变成无人值守任务,通常会挂到 Windows 计划任务里。我的做法是创建一个以 SYSTEM 身份运行的任务,因为 SYSTEM 权限足够高,不会受 UAC 弹窗影响,也不需要额外保存用户密码。用 PowerShell 注册任务的命令大致是这个样子:
$action = New-ScheduledTaskAction -Execute "C:\scripts\daily_report.exe" $trigger = New-ScheduledTaskTrigger -Daily -At 9:00AM $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName "DailyReport" -Action $action -Trigger $trigger -Principal $principal-ServiceAccount 表示用 SYSTEM 账户,-RunLevel Highest 表示使用最高权限运行。注册完成后,手动右键运行一次任务,再去“任务计划程序”里看“上次运行结果”,0 表示成功,非 0 值需要去事件查看器里找日志。SYSTEM 身份和用户身份跑同一个脚本的行为会有细微差异,比如网络映射盘符对 SYSTEM 不可见,脚本里如果依赖某个网络路径,就要提前把路径换成 UNC 格式。
脚本本身也应该加上日志输出,方便确认每次任务执行到哪一步。我习惯在脚本开头拼一个日志路径:
; 初始化日志文件,追加写入启动时间 Local $sLog = @ScriptDir & "\run.log" FileWrite($sLog, @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & " 任务启动" & @CRLF)@ScriptDir、@YEAR、@MON 这些宏在编译成 EXE 后依然有效,@ScriptDir 会指向 EXE 所在目录。日志文件和数据文件分开存放,避免每次执行覆盖掉上次的痕迹。这套做法我用了很久,中间最大的教训就是第一次编译时没固定 /x86,结果新电脑上的计划任务一直报 0x2 错误,折腾了一下午才发现是架构选错。后来我把编译命令做成了固定的批处理模板,每次打包都走同一个流程,再没在这个问题上翻过车。希望帮到你。
本文还有配套的精品资源,点击获取