JS宏重命名-文件名带有特殊字符的文件

wils
wils

创作者俱乐部成员

昨天有朋友问,为啥用JS宏重命名某个文件时出错

用的是这里的MoveFileA方法https://bbs.wps.cn/topic/47851

试了半天,发现这样的文件名会出错

你・好.txt

猜测原因可能是MoveFileA方法的参数是ANSI的文件名,而上面文件名中间那个点无法转为gbk编码所以出错


所以解决的办法就是改用MoveFileW

但这就有点麻烦,因为参数需要传递的是utf-16le的文件名


function tt()
{
    const x = 'C:\\Users\\Administrator\\Desktop\\你・好.txt'
    const y = 'C:\\Users\\Administrator\\Desktop\\a.txt'
    const a = ExecuteExcel4Macro(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, 4096, ${0x00001000 | 0x00002000}, 4)`)
    const b = ExecuteExcel4Macro(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, 4096, ${0x00001000 | 0x00002000}, 4)`)
    for (let i = 0; i < x.length; i++) {
        const c = x.charCodeAt(i)
        ExecuteExcel4Macro(`CALL("Ntdll", "RtlMoveMemory", "JJMJ", ${a + (i * 2)}, ${c & 0xFF}, 1)`)
        ExecuteExcel4Macro(`CALL("Ntdll", "RtlMoveMemory", "JJMJ", ${a + (i * 2 + 1)}, ${(c >> 8) & 0xFF}, 1)`)
    }
    for (let i = 0; i < y.length; i++) {
        const c = y.charCodeAt(i)
        ExecuteExcel4Macro(`CALL("Ntdll", "RtlMoveMemory", "JJMJ", ${b + (i * 2)}, ${c & 0xFF}, 1)`)
        ExecuteExcel4Macro(`CALL("Ntdll", "RtlMoveMemory", "JJMJ", ${b + (i * 2 + 1)}, ${(c >> 8) & 0xFF}, 1)`)
    }
    console.log(ExecuteExcel4Macro(`CALL("Kernel32", "MoveFileW", "JJJ", ${a}, ${b})`))
    ExecuteExcel4Macro(`CALL("Kernel32", "VirtualFree", "JJJJ", ${a}, 0, ${0x00008000})`)
    ExecuteExcel4Macro(`CALL("Kernel32", "VirtualFree", "JJJJ", ${b}, 0, ${0x00008000})`)
}

写的丑陋,但能用(比如M可以改成N,循环里直接写入c一次就行,等)

大概意思就是,自己申请内存,逐字节写入utf-16le的路径,然后调用MoveFileW重命名,就可以支持含特殊字符的文件名了

海南省
浏览 101
1
3
分享
3 +1
3
1 +1
全部评论 3
 
Esc2Exit
JS宏重命名-文件名带有特殊字符的文件 好内容,插个眼,回头好找。
· 河北省
回复
 
恰同学少年
越看越好
· 黑龙江省
回复
 
恰同学少年
· 黑龙江省
回复