You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:40:35