Board logo

标题: [问题求助] [已解决] VBS中创建带有unicode字符的快捷方式应如何改? [打印本页]

作者: adan1    时间: 2017-1-23 16:16     标题: [已解决] VBS中创建带有unicode字符的快捷方式应如何改?

本帖最后由 adan1 于 2017-1-27 19:41 编辑

由于脚本带有unciode字符,VBS文件必须保存为unicode编码,跟目标程序于同一目录下,这个目录也是带有unicode字符的。
就这样运行的话,第6行就报错了。
  1. rootPath=createobject("Scripting.FileSystemObject").GetFolder(".").Path
  2. currentPath=rootPath & "\"
  3. set WshShell=WScript.CreateObject("WScript.Shell")
  4. set oShellLink=WshShell.CreateShortcut(currentPath & "イブニクル・ランス版.lnk")
  5. oShellLink.TargetPath=currentPath & "EvenicleRance.exe"
  6. oShellLink.Arguments=""
  7. oShellLink.WorkingDirectory=currentPath
  8. 'oShellLink.Hotkey=""
  9. oShellLink.WindowStyle=1
  10. oShellLink.Description=""
  11. oShellLink.Save
复制代码

作者: yu2n    时间: 2017-1-23 20:32

曲线救国:先创建可操作的文件名(EvenicleRance.lnk),再重命名为你要的文件名(イブニクル・ランス版.lnk)。
  1. rootPath=createobject("Scripting.FileSystemObject").GetFolder(".").Path
  2. currentPath=rootPath & "\"
  3. set WshShell=WScript.CreateObject("WScript.Shell")
  4. set oShellLink=WshShell.CreateShortcut(currentPath & "EvenicleRance.lnk")
  5. oShellLink.TargetPath=currentPath & "EvenicleRance.exe"
  6. oShellLink.Arguments=""
  7. oShellLink.WorkingDirectory=currentPath
  8. 'oShellLink.Hotkey=""
  9. oShellLink.WindowStyle=1
  10. oShellLink.Description=""
  11. oShellLink.Save
  12. Set fso = CreateObject("Scripting.filesystemobject")
  13. fso.GetFile(currentPath & "EvenicleRance.lnk").Move currentPath & "イブニクル・ランス版.lnk"
复制代码

作者: adan1    时间: 2017-1-23 21:36

本帖最后由 adan1 于 2017-1-23 21:38 编辑

回复 2# yu2n


    感谢回答,思路上是可以的。不过在我这边用上面代码执行,同样报第6行的错,估计是目录带有unicode字符造成的。我另外测试,如果targetPath指向的文件名也带有unicode字符,依然会报错。
我感觉不解决根本的字符转换问题,会是处处碰壁。
作者: yu2n    时间: 2017-1-23 23:31

本帖最后由 yu2n 于 2017-1-23 23:33 编辑

回复 3# adan1

    测试环境:Win10x64。
    我这里测试自己的代码没有报错。
    我这里测试你的代码是第 12 行错误,没有第 6 行报错。第 6 行报错可能是没有写权限,第 12 行报错可能是字符集问题。

    说到底,你报错的提示是什么?
作者: adan1    时间: 2017-1-24 00:56

回复 4# yu2n

测试平台 Win7x86
1. 目标文件所在目录带有unicode字符,比如:・
    使用2L代码,执行后提示错误:

2. 目标文件名带有unicode字符,比如:・
    目录没有带unicode字符,使用2L代码并修改targetPath指向带有unicode字符名的文件,执行后提示错误:
作者: yu2n    时间: 2017-1-24 13:54

回复 5# adan1


    原来目录也是日文,没看清。
看来此路不通,换inf调用试试吧。

参考:
inf 创建 快捷方式
inf文件如何使用命令安装
作者: CommandBatCmd    时间: 2017-1-24 16:48

在1楼的代码中,没有什么逻辑错误,是由不同字符集和编码,以及程序和系统之间交互编码不统一造成的,和老生常谈的“乱码”问题没有什么本质的区别。

在1楼第5行的“CreateShortcut()”函数在保存处理结果之前,肯定进行了从来源字符串编码(unicode编码)到操作系统默认编码(ANSI编码)的转换,
windows的简体中文版的默认ANSI编码为:GB2312或GBK或GB18030,把unicode编码字符 ・ 转换到ANSI编码会变为半角问号 ?
所以函数“CreateShortcut()”保存的结果与输入的原始字符串不一致,这样会造成路径改变的错误,而半角问号又会造成无法保存的错误。

到现在为止,字符集和编码遗留下来的多足鼎立的现象还没有得到很好的根治,
加之操作系统、应用程序、储存的文件,它们之间没有强制性的、统一的、唯一的“中转”字符集和编码,
编写应用程序稍有考虑不周,产生错误则不可避免,如很多杀毒软件对unicode编码字符“☀☁☂☃☄☎☏☐☑☒”文件夹下的病毒无可奈何。
盼望计算机世界的字符集和编码大统一早日到来!!!

2楼的曲线救国,6楼的inf,实际中都存在字符集和编码的问题,退就其次的解决办法就是(权宜之计):
把存储体中超出系统默认编码的路径、文件名中的字符替换成系统默认编码之内的字符,
或者不读取包含超出系统默认编码字符的路径、文件名,
或者直接使用系统功能手动创建快捷方式。

以上个人拙见,与坛友共勉。
作者: 老刘1号    时间: 2017-1-24 23:21

这还不简单?VBS不能处理Unicode那就不处理呗
贯穿曲线救国思想,步骤如下:
1、把快捷方式整好
2、连带Unicode字符的目录与文件一起压缩为压缩包
3、需要时使用VBS解压压缩包即可
如果实在想要单文件,可以考虑文件转Hex嵌入到VBS里面。
作者: adan1    时间: 2017-1-26 17:05

回复 6# yu2n

没怎么弄过INF,常见于驱动那边,看上去会给系统绑定些什么的。。。
作者: adan1    时间: 2017-1-26 17:07

回复 7# CommandBatCmd


嗯,很同意历史遗留的编码问题,以前相对封闭的空间使用区域性编码,而现在全世界互联造成各种冲突。Windows上至今升级到WIN10好像仍用这样的编码方式,写个批处理换别的语言平台就显示乱码了。
你提出的只使用系统默认编码之内的字符,做法是正确的,不过我觉得这应该是真正软件开发者所要考虑的,而我只是事后为其做些小事情,在不破坏原有程序的前提下。前几次我遇到过带unicode字符的快捷方式,那时是使用形状相近的非unicode字符替换 临时解决掉,而现在连目录也带有unicode字符,现有的脚本无法可施。
作者: adan1    时间: 2017-1-26 17:09

回复 8# 老刘1号

。。。压缩包的方式算是写死了吧,而且还要求自带解压程序,这曲线想想都麻烦
作者: adan1    时间: 2017-1-26 17:11

我google了几篇国外求助贴,算是搞起来了。一开始是用VBS去执行powershell的,后来才想起可以直接VBS。。。
  1. set fso = CreateObject("Scripting.FileSystemObject")
  2. rootPath = fso.GetFolder(".").Path
  3. set objShell = CreateObject("shell.application")
  4. currentPath = rootPath & "\"
  5. set objFolder = objShell.NameSpace(currentPath)
  6. lnkname = "イブニクル・ランス版.lnk"
  7. set objFolderItem = objFolder.ParseName(lnkname)
  8. if objFolderItem Is Nothing then
  9.     fso.CreateTextFile currentPath & lnkname, true
  10.     set objFolderItem = objFolder.ParseName(lnkname)
  11. end if
  12. set objShellLink = objFolderItem.GetLink
  13. objShellLink.Path = currentPath & "Evenicle・Rance.exe"
  14. objShellLink.Arguments = ""
  15. objShellLink.WorkingDirectory = currentPath
  16. objShellLink.Hotkey = 0
  17. objShellLink.ShowCommand = 1
  18. objShellLink.Description = ""
  19. objShellLink.SetIconLocation currentPath & "Evenicle・Rance.exe", 0
  20. objShellLink.Save()
复制代码
暂时先这样,看看还有没需要改正的。
作者: CommandBatCmd    时间: 2017-1-26 20:02

回复 12# adan1


Windows Shell自己搞的东西还需自己收拾。
付出总有回报,问题总是没有办法多。
前进!前进!前进进!
作者: yu2n    时间: 2017-1-27 14:45

本帖最后由 yu2n 于 2017-1-27 14:46 编辑

Mark. 墙内资料不好找。
  1. 'VBS 使用 Shell.Application 创建快捷方式
  2. Option Explicit
  3. Main
  4. '================================================================================
  5. Sub Main()
  6. '================================================================================
  7. Dim exePath, lnkPath
  8. '在当前目录创建
  9. exePath = "Evenicle・Rance.exe"
  10. lnkPath = "イブニクル・ランス版.lnk"
  11. If CreateLink(exePath, lnkPath) Then
  12. Msgbox lnkPath & " 创建成功!", vbInformation, WScript.ScriptName
  13. Else
  14. Msgbox lnkPath & " 创建失败!", vbCritical, WScript.ScriptName
  15. End If
  16. '在当前用户桌面创建
  17. exePath = "Evenicle・Rance.exe"
  18. lnkPath = CreateObject("Wscript.Shell").SpecialFolders("Desktop") & "\イブニクル・ランス版.lnk"
  19. If CreateLink(exePath, lnkPath) Then
  20. Msgbox lnkPath & " 创建成功!", vbInformation, WScript.ScriptName
  21. Else
  22. Msgbox lnkPath & " 创建失败!", vbCritical, WScript.ScriptName
  23. End If
  24. End Sub
  25. '================================================================================
  26. '使用 Shell.Application 创建快捷方式
  27. '================================================================================
  28. Function CreateLink(ByVal exePath, ByVal lnkPath)
  29. Dim exeDir, exeName, lnkDir, lnkName
  30. Dim objFS, objShell, objFolder, objFolderItem, objShellLink
  31. Set objFS = CreateObject("Scripting.FileSystemObject")
  32. Set objShell = CreateObject("Shell.Application")
  33. CreateLink = False
  34. exeName = Split(exePath,"\")(UBound(Split(exePath,"\"))) '设置路径
  35. exeDir = Left(exePath, Len(exePath) - Len(exeName))
  36. lnkName = Split(lnkPath,"\")(UBound(Split(lnkPath,"\")))
  37. lnkDir = Left(lnkPath, Len(lnkPath) - Len(lnkName))
  38. If exeDir = "" Then exeDir = objFS.GetFolder(".").Path & "\"
  39. If lnkDir = "" Then lnkDir = exeDir
  40. Set objFolder = objShell.NameSpace(lnkDir) '获取快捷方式对象
  41. If objFolder Is Nothing Then Exit Function
  42. Set objFolderItem = objFolder.ParseName(lnkName)
  43. If objFolderItem Is Nothing Then
  44. objFS.CreateTextFile lnkPath, true
  45. Set objFolderItem = objFolder.ParseName(lnkName)
  46. If objFolderItem Is Nothing Then
  47. objFS.DeleteFile lnkPath
  48. Exit Function
  49. End If
  50. End If
  51. Set objShellLink = objFolderItem.GetLink '设置快捷方式属性
  52. objShellLink.Path = exePath
  53. objShellLink.Arguments = ""
  54. objShellLink.WorkingDirectory = exeDir
  55. objShellLink.Hotkey = 0
  56. objShellLink.ShowCommand = 1
  57. objShellLink.Description = ""
  58. objShellLink.SetIconLocation exePath, 0
  59. objShellLink.Save()
  60. CreateLink = True
  61. End Function
复制代码

作者: yu2n    时间: 2017-1-27 14:50

回复 9# adan1


    已测试 INF 无法创建带这些字符的快捷方式。
作者: adan1    时间: 2017-1-27 19:36

今天又是带有unicode的,而且是多个,顺应修改下复用。
  1. set objShell = CreateObject("shell.application")
  2. set fso = CreateObject("Scripting.FileSystemObject")
  3. Function createLink(path, linkName)
  4.     set objFolder = objShell.NameSpace(path)
  5.     set objFolderItem = objFolder.ParseName(linkName)
  6.     if objFolderItem Is Nothing then
  7.         fso.CreateTextFile path & linkName, true
  8.         set objFolderItem = objFolder.ParseName(linkName)
  9.     end if
  10.     set createLink = objFolderItem.GetLink
  11. End Function
  12. rootPath = fso.GetFolder(".").Path
  13. Function currentPath(path)
  14.     if isNull(path) then
  15.         currentPath = rootPath
  16.     elseif path = "" then
  17.         currentPath = rootPath & "\"
  18.     elseif path = "\" then               '特殊
  19.         currentPath = rootPath
  20.     elseif left(path, 1) = "\" then      '特殊
  21.         currentPath = rootPath & path
  22.     elseif right(path, 1) = "\" then
  23.         currentPath = rootPath & "\" & path
  24.     else
  25.         currentPath = rootPath & "\" & path & "\"
  26.     end if
  27. End Function
  28. set objShellLink = createLink(currentPath(""), "手垢塗れの天使.lnk")
  29. objShellLink.Path = currentPath("") & "angel.exe"
  30. objShellLink.Arguments = ""
  31. objShellLink.WorkingDirectory = currentPath("\")
  32. objShellLink.Hotkey = 0
  33. objShellLink.ShowCommand = 1
  34. objShellLink.Description = ""
  35. objShellLink.SetIconLocation currentPath("") & "angel.exe", 0
  36. objShellLink.Save()
  37. set objShellLink = createLink(currentPath(""), "手垢塗れの天使の詳細設定.lnk")
  38. objShellLink.Path = currentPath("") & "angel.exe"
  39. objShellLink.Arguments = "-userconf"
  40. objShellLink.WorkingDirectory = currentPath("\")
  41. objShellLink.Hotkey = 0
  42. objShellLink.ShowCommand = 1
  43. objShellLink.Description = ""
  44. 'objShellLink.SetIconLocation currentPath("") & ".exe.ico.dll", 0
  45. objShellLink.Save()
  46. set objShellLink = createLink(currentPath(""), "手垢塗れの天使のファイル破損チェック.lnk")
  47. objShellLink.Path = currentPath("data") & "ファイル破損チェックツール.exe"
  48. objShellLink.Arguments = ""
  49. objShellLink.WorkingDirectory = currentPath("\")
  50. objShellLink.Hotkey = 0
  51. objShellLink.ShowCommand = 1
  52. objShellLink.Description = ""
  53. 'objShellLink.SetIconLocation currentPath("") & ".exe.ico.dll", 0
  54. objShellLink.Save()
复制代码

作者: adan1    时间: 2017-1-27 19:38

回复 14# yu2n

不错




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2