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

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重命名,就可以支持含特殊字符的文件名了