对于我目前正在处理的VBA项目,我需要从.url文件中提取目标路径(由Internet Explorer在“收藏夹”文件夹中使用)。首先,我使用 FileSystemObject :
访问该文件Public SourceFile As Scripting.File
接下来我使用:
target = CreateObject("Wscript.Shell").CreateShortcut(SourceFile.Path).targetpath
提取webadress。一般来说,这种方法工作正常,但我遇到了某些文件的奇怪问题。它们的共同之处在于文件名中有一个特殊字符。例如:
▶John Cleese解释愚蠢 - YouTube.url
代码不会中断,但 target 结果为空。然后,在访问 IWshURLShortcut 的 targetpath 属性之前,我打破了代码以创建单独的 IWshShell3 和 IWshURLShortcut 对象宾语。两个对象都已创建。
现在,如果我在正常情况下正确理解, IWshURLShortcut 对象将引用由 SourceFile.Path 表示的现有.url文件,该文件已包含值 targetpath 属性。所以我的(受过教育的)猜测是,当作为参数传递给 CreateShortcut 方法时,▶以某种方式被翻译(或省略),因此实际上创建了一个新的快捷方式(在内存中),具有不同的name,而不是引用现有的.url文件。由于 targetpath 属性尚未保留值, target 结果为空。
当然,我首先在强大的互联网上寻找解决方案。看到特殊字符我认为问题在于 SourceFile.Path 表示的字符串的编码;据我所知,VBA使用ANSI编码但原始文件名是Unicode(▶ 黑色右指三角,代码 U + 25B6 )。从这里开始变得非常朦胧;作为一名自学成才的VBA程序员,我对编码不太熟悉,所以我被困住了。有人建议将字符串分解为字节数组,并将其作为 CreateShortcut 方法的参数传递。我设法这样做但它没有用(目标仍然是空的):
Dim arr_test() As Byte: arr_test = SourceFile.Path
target = CreateObject("Wscript.Shell").CreateShortcut(arr_test).targetpath
基本上我有两个问题:
到目前为止,我对问题的分析是否正确?
如果是这样,我如何确保作为 CreateShortcut 方法的参数传递的字符串是Unicode编码的?当然我正在寻找一个简单但通用的解决方案,所以没有单独处理▶(我见过其他特殊字符,如≥导致同样的问题,理想情况下我不想单独处理它们。)
非常感谢任何帮助!