[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决] 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
复制代码

曲线救国:先创建可操作的文件名(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"
复制代码
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

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

回复 2# yu2n


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

TOP

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

回复 3# adan1

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

    说到底,你报错的提示是什么?
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 4# yu2n

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

2. 目标文件名带有unicode字符,比如:・
    目录没有带unicode字符,使用2L代码并修改targetPath指向带有unicode字符名的文件,执行后提示错误:

TOP

回复 5# adan1


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

参考:
inf 创建 快捷方式
inf文件如何使用命令安装
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

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

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

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

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

以上个人拙见,与坛友共勉。

TOP

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

TOP

回复 6# yu2n

没怎么弄过INF,常见于驱动那边,看上去会给系统绑定些什么的。。。

TOP

回复 7# CommandBatCmd


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

TOP

回复 8# 老刘1号

。。。压缩包的方式算是写死了吧,而且还要求自带解压程序,这曲线想想都麻烦

TOP

我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()
复制代码
暂时先这样,看看还有没需要改正的。
1

评分人数

    • yu2n: 使用shell.application创建快捷方式,不错。 ...技术 + 1

TOP

回复 12# adan1


Windows Shell自己搞的东西还需自己收拾。
付出总有回报,问题总是没有办法多。
前进!前进!前进进!

TOP

本帖最后由 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
复制代码
1

评分人数

『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 9# adan1


    已测试 INF 无法创建带这些字符的快捷方式。
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

返回列表