AutoHotkey清理脚本技术咨询:Glob功能、通配符及排除规则
原AutoHotkey脚本
Glob(list, A_AppData "Local\Company\Program 1\Program 1\*.*") Glob(list, A_AppData "Local\Company\Program 2\Program 2\*.*") Loop, Parse, list, `n { FileGetAttrib, FolderOrFile, %A_LoopField% IfInString, FolderOrFile, D FileRemoveDir, %A_LoopField%, 1 else FileDelete, %A_LoopField% } MsgBox, Clean-up complete. ;Uncomment (Remove the semi-colon) this next line if you want to see what couldn't be deleted. ;MsgBox %list% Glob(ByRef list, Pattern, IncludeDirs=1) { if (i:=RegExMatch(Pattern,"[*?]")) && (i:=InStr(Pattern,"\",1,i+1)) Loop, % SubStr(Pattern, 1, i-1), 2 Glob(list, A_LoopFileLongPath . SubStr(Pattern,i), IncludeDirs) else Loop, %Pattern%, %IncludeDirs% list .= (list="" ? "" : "`n") . A_LoopFileLongPath }
问题解答
1. Glob函数的具体功能
这个Glob函数是AutoHotkey实现的通配符路径匹配工具,核心作用是把符合指定通配符模式的所有文件/目录的完整路径收集到传入的list变量中,细节逻辑如下:
- 支持
*(匹配任意长度字符)和?(匹配单个字符)两种通配符,还能处理路径中间带通配符的情况(比如C:\Test\*\*.txt)。 - 当检测到模式里的通配符后面还有路径分隔符
\时,会先遍历通配符前的目录,再递归调用自身处理剩余的路径部分,实现深层路径的通配匹配。 - 参数
IncludeDirs默认值为1,控制是否把匹配到的目录也加入结果列表;设为0的话只会收集文件路径。 - 最终所有匹配到的路径会以换行符分隔,追加到
ByRef传递的list变量里,供后续处理使用。
2. 通配符*与*.*的区别,以及删除指定目录内容的正确写法
在AutoHotkey的文件匹配逻辑里:
*:匹配所有文件和目录,包括无扩展名的文件、带扩展名的文件,以及子目录。*.*:仅匹配文件名中包含小数点的文件,也就是有扩展名的文件;无扩展名的文件、子目录都会被漏掉。
如果你只想删除指定目录下的所有内容(包括所有文件和子目录),需要把脚本里的*.*改成*,也就是把前两行改成:
Glob(list, A_AppData "Local\Company\Program 1\Program 1\*") Glob(list, A_AppData "Local\Company\Program 2\Program 2\*")
这样Glob就能收集到目标目录下的所有文件和子目录,后续的删除循环就能处理全部内容。
3. 实现排除特定扩展名的文件
可以在删除文件的分支里增加扩展名判断,跳过需要保留的文件。比如要排除.txt和.exe文件,修改Loop, Parse部分的代码:
Loop, Parse, list, `n { FileGetAttrib, FolderOrFile, %A_LoopField% IfInString, FolderOrFile, D FileRemoveDir, %A_LoopField%, 1 else { ; 获取当前文件的扩展名 SplitPath, A_LoopField, , , fileExt ; 定义要排除的扩展名(小写,统一判断避免大小写问题) excludedExts := ["txt", "exe"] ; 如果扩展名在排除列表里,跳过删除 if excludedExts.HasKey(fileExt) continue ; 否则执行删除 FileDelete, %A_LoopField% } }
原理是用SplitPath提取文件扩展名,然后和预设的排除列表对比,匹配到就跳过当前文件的删除操作。如果要排除其他扩展名,直接在excludedExts数组里添加即可。
内容的提问来源于stack exchange,提问作者user2319146
相关产品推荐
相关产品推荐

