很多 AHK 脚本看起来像是命令不会用,实际问题经常出在文件路径、工作目录和编码上。尤其是脚本换一个文件夹就失效、FileRead 读出来乱码、FileAppend 写日志失败,这些都不是孤立问题,而是同一套文件处理基础没有搭好。

先给结论

  • 读一个小文本文件:优先用 FileRead
  • 写日志、追加内容:优先用 FileAppend
  • 读写大文件、二进制文件、需要控制编码:优先用 FileOpen()
  • 保存脚本配置:优先用 IniReadIniWrite。AHK自带的ini命令不好用,推荐:Easyini库
  • 脚本随文件夹移动还要稳定:路径优先从 A_ScriptDir 拼出来。
  • 中文乱码:先检查脚本文件编码,再检查读取/写入时的文件编码。

最推荐的新手写法

把脚本相关文件放在脚本同目录下,然后所有路径都从 A_ScriptDir 开始拼。这样脚本放桌面、U 盘、工具目录里都不容易坏。

#Requires AutoHotkey v1.1
SetWorkingDir, %A_ScriptDir%

file := A_ScriptDir "\data.txt"

if !FileExist(file) {
    FileAppend, 第一行内容`n, %file%, UTF-8
}

FileRead, text, %file%
MsgBox, % text

这里有两个关键点:第一,路径不是直接写 data.txt,而是拼成 A_ScriptDir "\data.txt";第二,写入中文内容时明确给出 UTF-8,可以少踩很多乱码坑。

FileRead 适合什么场景

FileRead 适合一次性读取文本内容,比如读取模板、读取小型数据文件、读取网页源码缓存。它的优点是简单,缺点是文件很大时会一次性读入内存。

path := A_ScriptDir "\模板.txt"
FileRead, tpl, %path%

StringReplace, tpl, tpl, {name}, 张三, All
MsgBox, % tpl

FileAppend 适合写日志

调试脚本时,不要总靠 MsgBox。日志更适合排查定时器、循环、后台自动化这类问题。

logFile := A_ScriptDir "\run.log"
FormatTime, now,, yyyy-MM-dd HH:mm:ss
FileAppend, [%now%] 脚本启动`n, %logFile%, UTF-8

FileOpen 什么时候更合适

当你需要逐行读取、大文件处理、二进制读写,或者更细地控制换行和编码时,FileOpen()FileReadFileAppend 更稳。

path := A_ScriptDir "\list.txt"
file := FileOpen(path, "r", "UTF-8")

while !file.AtEOF {
    line := file.ReadLine()
    if (line != "")
        ToolTip, % line
}

file.Close()

INI 更适合保存配置

如果你只是保存窗口位置、账号开关、用户选择、路径配置,不建议自己拼文本格式。INI 对 AHK v1 来说足够简单,也方便人工修改。

ini := A_ScriptDir "\config.ini"

IniWrite, C:\Users\Public\Desktop, %ini%, path, desktop
IniRead, desktopPath, %ini%, path, desktop
MsgBox, % desktopPath

最常见的 4 个坑

  • 只写相对路径,双击能用,计划任务或管理员运行后找不到文件。
  • 脚本是 ANSI,文本是 UTF-8,或者反过来,导致中文乱码。
  • 写日志时忘了换行,所有内容挤成一行。
  • 读取大文件还用 FileRead,导致脚本卡住。

 

站内延伸

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。