我有时不得不处理在Mac环境中生成的文件,以及包含分解字符的文件名(看起来像“é”,但实际上是“ e”)。显然,Scripting.FileSystemObject无法识别这些内容,因此无法对其进行操作。我需要以编程方式重命名这些文件以删除分解后的字符,然后再进行进一步处理。
从我发现的结果来看:“é(U + 00E9)是一个可以分解为等效的基本字母e(U + 0065)的字符串,并且可以合并锐音(U + 0301)的字符。 >
换句话说,两个字符串看起来都完全像这样:“é”,但是第一个字符串的长度为1,第二个字符串的长度为2。如果进行转换,则实际上看起来像是“ e”。
这是一个用于测试目的的小脚本:
(请通过复制/粘贴名称来创建这两个测试文件) 具有组成字符的文件名(有效):é.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
具有分解字符的文件将产生“找不到文件”错误。 我设法将字符串从分解的字符转换为组合的字符,但是在尝试重命名实际文件时仍然无法正常工作。
我现在完全被困住了,任何帮助将不胜感激!预先感谢。
答案 0 :(得分:1)
这与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)。 / p>
问题是VBS的DropHandler不能以Unicode方式解析已删除的对象。
您的代码依赖于显然被删除的项目,因此您依赖于WScript.Arguments
。
FSO函数可以处理您所描述的文件名。 您可以通过执行
Set objFile = FSO.GetFile("<PATH>\e´.txt")`
甚至
FSO.FileExists("<PATH>\e´.txt")
但是,通过参数传入的文件名已经被drophandler破坏了。除了在Windows注册表中弄乱或通过更改脚本以不使用“拖拽”而是从OpenFile对话框中获取文件名之外,我看不到任何更改此行为的安全方法。