如何以编程方式重命名包含分解字符的文件?
How to programmatically rename a file containing decomposed characters?
我偶尔不得不处理在 Mac 环境中生成的文件,以及包含分解字符(看起来像“é”,但实际上是 "e´")的文件名。 Scripting.FileSystemObject 显然无法识别这些,因此无法采取行动。我需要以编程方式重命名这些文件以在进一步处理之前删除分解的字符。
根据我的发现:“é (U+00E9) 是一个可以分解为基本字母 e (U+0065) 和重音符号 (U+0301) 组合的等效字符串的字符。”。 =11=]
换句话说,两个字符串看起来都是这样的:“é”,但是第一个的长度是1,第二个的长度是2。如果转换的话,实际上是这样的"e´".
这里有一个用于测试目的的小脚本:
(请按 copy/pasting 名称创建这两个测试文件)
具有组合字符的文件名(有效):é.txt
具有分解字符的文件名(无效):é.txt
Set args = WScript.Arguments
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Arg in Wscript.Arguments
Set objFile = FSO.GetFile(Arg)
fPath = Left(objFile.Path, Len(objFile.Path)-Len(objFile.Name))
FSO.movefile arg, fpath & "a.txt"
Set objFile = Nothing
Set FSO = Nothing
next
具有分解字符的文件产生 "File not found" 错误。
我设法将字符串从分解字符转换为组合字符,但在尝试重命名实际文件时仍然无法正常工作。
我完全被困在这一点上,非常感谢任何帮助!提前致谢。
这与 VBS/WSH DropHandler
(HKEY_CLASSES_ROOT\VBSFile\ShellEx\DropHandler)
VBS/WSH 个文件的 DropHandler 是 {60254CA5-953B-11CF-8C96-00AA00B8708C}
。
EXE/BAT/CMD 个文件由 {86C86720-42A0-1069-A2E8-08002B30309D}
处理。
VBS/WSH drophandler 将丢弃的对象解析为长文件路径,而 EXE/BAT/CMD drophandler 将丢弃的对象解析为短文件路径(如 C:\PROGRA~ 1).
问题是VBS的DropHandler没有以Unicode方式解析拖放的对象。
您的代码显然依赖于掉落的物品,因此您依赖于 WScript.Arguments
。
FSO 函数可以像您描述的那样处理文件名。
您可以通过执行
来测试它
Set objFile = FSO.GetFile("<PATH>\e´.txt")`
甚至
FSO.FileExists("<PATH>\e´.txt")
但是,通过参数,文件名已经被 drophandler 破坏了。除了在 Windows 注册表中乱搞或者将脚本更改为不使用 'drag-'n-drop' 但也许从 OpenFile 对话框中获取文件名外,我看不到更改此行为的安全方法。
我偶尔不得不处理在 Mac 环境中生成的文件,以及包含分解字符(看起来像“é”,但实际上是 "e´")的文件名。 Scripting.FileSystemObject 显然无法识别这些,因此无法采取行动。我需要以编程方式重命名这些文件以在进一步处理之前删除分解的字符。
根据我的发现:“é (U+00E9) 是一个可以分解为基本字母 e (U+0065) 和重音符号 (U+0301) 组合的等效字符串的字符。”。 =11=]
换句话说,两个字符串看起来都是这样的:“é”,但是第一个的长度是1,第二个的长度是2。如果转换的话,实际上是这样的"e´".
这里有一个用于测试目的的小脚本:
(请按 copy/pasting 名称创建这两个测试文件) 具有组合字符的文件名(有效):é.txt
具有分解字符的文件名(无效):é.txt
Set args = WScript.Arguments
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Arg in Wscript.Arguments
Set objFile = FSO.GetFile(Arg)
fPath = Left(objFile.Path, Len(objFile.Path)-Len(objFile.Name))
FSO.movefile arg, fpath & "a.txt"
Set objFile = Nothing
Set FSO = Nothing
next
具有分解字符的文件产生 "File not found" 错误。 我设法将字符串从分解字符转换为组合字符,但在尝试重命名实际文件时仍然无法正常工作。
我完全被困在这一点上,非常感谢任何帮助!提前致谢。
这与 VBS/WSH DropHandler
(HKEY_CLASSES_ROOT\VBSFile\ShellEx\DropHandler)
VBS/WSH 个文件的 DropHandler 是 {60254CA5-953B-11CF-8C96-00AA00B8708C}
。
EXE/BAT/CMD 个文件由 {86C86720-42A0-1069-A2E8-08002B30309D}
处理。
VBS/WSH drophandler 将丢弃的对象解析为长文件路径,而 EXE/BAT/CMD drophandler 将丢弃的对象解析为短文件路径(如 C:\PROGRA~ 1).
问题是VBS的DropHandler没有以Unicode方式解析拖放的对象。
您的代码显然依赖于掉落的物品,因此您依赖于 WScript.Arguments
。
FSO 函数可以像您描述的那样处理文件名。 您可以通过执行
来测试它Set objFile = FSO.GetFile("<PATH>\e´.txt")`
甚至
FSO.FileExists("<PATH>\e´.txt")
但是,通过参数,文件名已经被 drophandler 破坏了。除了在 Windows 注册表中乱搞或者将脚本更改为不使用 'drag-'n-drop' 但也许从 OpenFile 对话框中获取文件名外,我看不到更改此行为的安全方法。