AHK脚本分享,修复file链接

我的论文以file链接的形式链接到ob笔记里,论文不放进笔记库(笔记库放过多的东西会卡顿),阅读用的是本地阅读器。使用中的一个问题是,pdf移动位置,链接就失效了。为解决这个痛点,写了修复file链接工具。

脚本需要输入两个参数,一个是论文阅读笔记的文件夹,一个是论文存放文件夹,设置好运行即可。

对于其它附件,比如视频等,如果是file链接,也可以用此脚本修复,把pdf后缀改成相应后缀即可。

对于不同文件夹相同文件名的文件,匹配时会选择文件夹名字在前的。(a 论文论文两个文件夹有同名文件时,匹配a 论文 文件夹)。

脚本只会修改链接目标不存在的链接,不会修改链接目标存在的链接(a 论文论文两个文件夹有同名文件时,链接到论文的链接不会被修改)。

2 个赞
FileEncoding, UTF-8-RAW ;20210314_1506
/*
220227_211657,改用AHK实现,python手生,类不会用。
220228_162257,pdf文件列表排序,使得可以通过调整文件夹名让脚本选择指定文件夹文件。
*/
;220227_212020,通用变量区。 
论文库 := "C:\论文\"
; 笔记文件夹 := "H:\论文\"
笔记文件夹 := "H:\笔记\笔记\6 阅读笔记\"

;220227_211730,遍历pdf,转义成url格式,生成file:///数组
PathList := ""
Loop , Files, %论文库%*.pdf, R ; 递归子文件夹,此处指定为md文件;
{
    A_LoopFileFullPath1 := SksSub_UrlEncode(A_LoopFileFullPath)
    PathList := PathList . A_LoopFileFullPath1 . "`n"
}

Sort, PathList, R  ; R 选项使得以逆序排列. 请参阅 Sort 了解其他选项.220228_162108

;220227_211939,转义路径为url,原来的会把汉字也转义,不太好。
SksSub_UrlEncode(str, enc="UTF-8") 
{
    str := StrReplace(str," ","%20")
    ; str := StrReplace(str,":","%3A")
    str := StrReplace(STR,"\","%5C")
    encoded := "file:///" . str
    Return encoded
}

;220227_211813,遍历md文件,检查是否有file链接,如果有验证是否在file数组里,是则比较是否正确,修改,否则输出日志
Loop , Files, %笔记文件夹%*.md, R ; 递归子文件夹,此处指定为md文件;
{
    笔记内容 := FileOpen(A_LoopFileFullPath, "r").Read()
    新笔记内容 := ""
    index := 0
    搜索位置 := 1
    链接数组 := []
    loop 999
    {
        index := index +1
        结果位置 := RegExMatch(笔记内容, "file:///(.*?).pdf",链接, 搜索位置)
        if (链接 = "")
            break
        链接数组.Insert(链接)
        搜索位置 := 结果位置+StrLen(链接)
        链接 := ""

    }
    for index, element in 链接数组 ; 220228_001853,各链接
    {
        ;220228_002722,如果在地址列表中,则正确,如果不在,就修复
        ; msgbox,% element
        if instr(PathList,element)
        {
            ; MSGBOX,在列表中
            Continue
        }
        Else
        {
            ;220228_002902,拆分出文件名
            RegExMatch(element, "file:///(.*)%5C",路径,1)
            文件名 := StrReplace(element,路径)
            ; msgbox,% 文件名 . "不在列表中`n" . 路径

            ;220228_013102,含有文件名的路径认为是正确路径。
            Loop, parse, PathList, `n, `r ; 在 `r 之前指定 `n, 这样可以同时支持对 Windows 和 Unix 文件的解析.
            {
                if instr(A_LoopField,文件名)
                    新笔记内容 := StrReplace(笔记内容,element,A_LoopField)
            }
        }
    }
    if (新笔记内容 != "")
        FileOpen(A_LoopFileFullPath, "w").Write(新笔记内容)
}


库内的链接(md格式)修复用pytho做了,有空发上来。

做成exe,用窗口选择笔记所在文件夹和论文所在文件夹会更方便些,懒得做,有人有需要我再做。

有空加上未成功修复链接记录功能,把未修复的链接(目标不存在,又没找到目标)汇总,以便手动修复。