找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 46405|回复: 16

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

[复制链接]
发表于 2017-1-23 16:16:01 | 显示全部楼层 |阅读模式
本帖最后由 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

复制代码
发表于 2017-1-23 20:32:44 | 显示全部楼层
曲线救国:先创建可操作的文件名(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"
复制代码
 楼主| 发表于 2017-1-23 21:36:35 | 显示全部楼层
本帖最后由 adan1 于 2017-1-23 21:38 编辑

回复 2# yu2n


    感谢回答,思路上是可以的。不过在我这边用上面代码执行,同样报第6行的错,估计是目录带有unicode字符造成的。我另外测试,如果targetPath指向的文件名也带有unicode字符,依然会报错。
我感觉不解决根本的字符转换问题,会是处处碰壁。
发表于 2017-1-23 23:31:28 | 显示全部楼层
本帖最后由 yu2n 于 2017-1-23 23:33 编辑

回复 3# adan1

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

    说到底,你报错的提示是什么?
 楼主| 发表于 2017-1-24 00:56:13 | 显示全部楼层
回复 4# yu2n

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

2. 目标文件名带有unicode字符,比如:・
    目录没有带unicode字符,使用2L代码并修改targetPath指向带有unicode字符名的文件,执行后提示错误:
发表于 2017-1-24 13:54:46 | 显示全部楼层
回复 5# adan1


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

参考:
inf 创建 快捷方式
inf文件如何使用命令安装
发表于 2017-1-24 16:48:20 | 显示全部楼层
在1楼的代码中,没有什么逻辑错误,是由不同字符集和编码,以及程序和系统之间交互编码不统一造成的,和老生常谈的“乱码”问题没有什么本质的区别。

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

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

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

以上个人拙见,与坛友共勉。
发表于 2017-1-24 23:21:34 | 显示全部楼层
这还不简单?VBS不能处理Unicode那就不处理呗
贯穿曲线救国思想,步骤如下:
1、把快捷方式整好
2、连带Unicode字符的目录与文件一起压缩为压缩包
3、需要时使用VBS解压压缩包即可
如果实在想要单文件,可以考虑文件转Hex嵌入到VBS里面。
 楼主| 发表于 2017-1-26 17:05:30 | 显示全部楼层
回复 6# yu2n

没怎么弄过INF,常见于驱动那边,看上去会给系统绑定些什么的。。。
 楼主| 发表于 2017-1-26 17:07:33 | 显示全部楼层
回复 7# CommandBatCmd


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

。。。压缩包的方式算是写死了吧,而且还要求自带解压程序,这曲线想想都麻烦
 楼主| 发表于 2017-1-26 17:11:35 | 显示全部楼层
我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技术 +1 收起 理由
yu2n + 1 使用shell.application创建快捷方式,不错。 ...

查看全部评分

发表于 2017-1-26 20:02:51 | 显示全部楼层
回复 12# adan1


Windows Shell自己搞的东西还需自己收拾。
付出总有回报,问题总是没有办法多。
前进!前进!前进进!
发表于 2017-1-27 14:45:00 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
adan1 + 1 不错

查看全部评分

发表于 2017-1-27 14:50:45 | 显示全部楼层
回复 9# adan1


    已测试 INF 无法创建带这些字符的快捷方式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 10:42 , Processed in 0.024203 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表