中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-04 03:32
48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » [VBS]slore,baomaboy兄帮我看下我注册表右键出错为什么?
可打印版本  1,002 / 10
第1楼 kich 发表于 2007-04-12 02:33
中级用户 发帖 168 积分 397
[VBS]slore,baomaboy兄帮我看下我注册表右键出错为什么?
程序代码是这样的(我是模仿baomaboy写的):

Dim FSO,Ws,ScriptFolder,SN,SFN,TheScript,Args

Set FSO=CreateObject("Scripting.FileSystemObject")
Set Ws = CreateObject("WScript.Shell")
Set Args = WScript.Arguments

'取得系统文件夹并准备创建脚本
SN=WScript.ScriptName
SFN=WScript.ScriptFullName
ScriptFolder= FSO.GetSpecialFolder(1)
TheScript=FSO.BuildPath(ScriptFolder,SN)


'设置文件夹右键关联注册表项
RegPath1="HKEY_CLASSES_ROOT\Directory\shell\SendLink\"
RegValue1="将当前文件夹发送到快捷菜单"
RegForm1="REG_SZ"
RegPath2="HKEY_CLASSES_ROOT\Directory\shell\SendLink\command\"
RegValue2="wscript.exe " & chr(34) & TheScript & chr(34) & " " & chr(34) & "%L" & chr(34)
RegForm2="REG_SZ"

'如果不是运行系统文件夹下的脚本,即外部安装
If SFN<>TheScript Then
answer=MsgBox("【是】将“"&RegValue1&"”加入到右键菜单,"&vbCr&"【否】将“"&RegValue1&"”从右键菜单删除。 ", 67, "安装脚本")
If answer = vbYes Then
Ws.RegWrite RegPath1,RegValue1,RegForm1
Ws.RegWrite RegPath2,RegValue2,RegForm2
FSO.GetFile(SFN).Copy(TheScript)
MsgBox "添加脚本“"&SN&"”成功",64,"添加成功"
ElseIf answer =vbNo Then
Ws.RegDelete RegPath2
Ws.RegDelete RegPath1
FSO.DeleteFile TheScript
MsgBox "删除注册表和脚本“"&SN&"”成功",64,"删除成功"
Else
WScript.Quit
End If
'右键调用的时候
Else
......(执行操作的脚本,后面就不说了)


=======================

问题:我添加注册表右键可以,成功添加,而且程序也可以顺利进行,但是为什么删除这个右键的时候,却说无法移除那注册表值,请问是怎么回事?
出错在什么地方?我实在是找不出原因了!

谢谢

[ Last edited by kich on 2007-4-12 at 07:59 AM ]
第2楼 kich 发表于 2007-04-12 11:42
中级用户 发帖 168 积分 397
晕,自己解决了!!
是因为已经删除过一次,再删除就不行了!!
如果用 On Error Resume Next 在前面就OK了!!
但我记得右键始终是在的啊,所以误以为没删除掉!
不知道怎么混乱了!!
是不是删除后,文件夹要重新开,注册表起的作用才会起作用啊>??

我设置右键是作用在文件夹上的!!
第3楼 baomaboy 发表于 2007-04-13 01:35
银牌会员 发帖 554 积分 1,513
Originally posted by kich at 2007-4-12 11:42:
晕,自己解决了!!
是因为已经删除过一次,再删除就不行了!!
如果用 On Error Resume Next 在前面就OK了!!
但我记得右键始终是在的啊,所以误以为没删除掉!
...


你记得右键始终在 只说明注册表键值由于某种原因为能删除 ,没测试所以我不能告诉你是什么原因,我只能说对于此例最好加入On Error Resume Next 不然出错时中途卡住退出了 有可能你还理所当然的认为所有操作都完成了呢。

另外 你所说的“文件夹重新打开” 我不明白什么意思 文件夹的右键菜单是及时生效的,不用重启explorer也不用注销。

[ Last edited by baomaboy on 2007-4-13 at 03:10 AM ]
第4楼 baomaboy 发表于 2007-04-13 03:43
银牌会员 发帖 554 积分 1,513
Originally posted by kich at 2007-4-12 02:33:
程序代码是这样的(我是模仿baomaboy写的):

Dim FSO,Ws,ScriptFolder,SN,SFN,TheScript,Args

Set FSO=CreateObject("Scripting.FileSystemObject")
Set Ws = CreateObject("W ...


一般有两个原因:
①权限问题
②删除顺序问题

添加/删除 同于一个代码中 按理不会有权限问题,
不同于REG的删除简单一个“-” 一了百了,VBS删除注册表必须按由末级向上层层删除,看你的代码也不存在此问题。但也许你的注册表父项继承权限特殊或者你在那个注册表项下还建了其他项呢 。

我没你的环境 不能准确告诉你 以上权当参考 也许还有其他我没想到的原因。
第5楼 baomaboy 发表于 2007-04-13 03:45
银牌会员 发帖 554 积分 1,513
原来你是 连续两次删除 造成删除一个没有的值而出错的
但怎么回有你所说的混乱呢 点第一次时有菜单→卸载删除→点第二次右键 应该无菜单了 除非你能做到 卸载删除 过程中保持第一次的右键菜单。

[ Last edited by baomaboy on 2007-4-13 at 03:51 AM ]
第6楼 kich 发表于 2007-04-13 06:54
中级用户 发帖 168 积分 397
呵呵,当时程序刚编写完!出错在哪我也不大记得了,就记得当时怎么删右键都删不掉!!
有点纳闷!!

还有.问下,删除快捷方式箭头注册表值是不是:
RegPath1="HKCR\lnkfile\IsShortcut\"
RegPath2="HKCR\piffile\IsShortcut\"
??
删除后,注册表有变化吗?不是说系统,是说注册表,我进去看,好象没看见变化,可能是自己写错的了!!
"IsShortcut"是右边的值,是不是不可以写在地址中,是要写在逗号后面吗?

网上查了说,要重起,或者干掉进程 explorer 然后重开才行!
VBS怎么操作呢??

[ Last edited by kich on 2007-4-13 at 06:56 AM ]
第7楼 baomaboy 发表于 2007-04-13 07:29
银牌会员 发帖 554 积分 1,513
Originally posted by kich at 2007-4-13 06:54:
呵呵,当时程序刚编写完!出错在哪我也不大记得了,就记得当时怎么删右键都删不掉!!
有点纳闷!!

还有.问下,删除快捷方式箭头注册表值是不是:
RegPa ...


参考下帖:
删除/添加快捷方式字样和箭头→VBS版

VBS中操作注册表用“\”符号结尾来区分"键和键值,有则为键,无则为值,所以你的RegPath1="HKCR\lnkfile\IsShortcut\是错误的。

下面 结束并重启explorer
第8楼 kich 发表于 2007-04-13 10:56
中级用户 发帖 168 积分 397
哦,谢谢啊,这下:HKCR\lnkfile\IsShortcut 这个对了!是建到右边去了,多谢指导!!

还有,[ If WinVer("OS") <> "Windows_NT" Then ]
If WinVer("OS") 可以直接用吗?
WinVer可以??OS什么东东,也可以直接用吗?
没见过!!不好意思,劳驾!!
Thx
第9楼 baomaboy 发表于 2007-04-13 11:16
银牌会员 发帖 554 积分 1,513
Originally posted by kich at 2007-4-13 10:56:
哦,谢谢啊,这下:HKCR\lnkfile\IsShortcut 这个对了!是建到右边去了,多谢指导!!

还有,
If WinVer("OS&quo ...


Set WinVer = WshSHell.Environment("Process")
第10楼 slore 发表于 2007-04-13 11:26
铂金会员 发帖 2,478 积分 5,212
还可以使用WMI获取系统版本

'第1种WMI的使用
strComputer = "."
Dim objWMIService
Dim colOperatingSystems
Dim objOperatingSystem
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colOperatingSystems = objWMIService.ExecQuery _
("Select * from Win32_OperatingSystem")
For Each objOperatingSystem In colOperatingSystems
MsgBox "你当前使用的系统是:" & objOperatingSystem.Caption
MsgBox "你当前的系统版本是:" & objOperatingSystem.Version
Next

'第2种WMI的使用
Set colOperatingSystems = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_OperatingSystem")
For Each objOperatingSystem In colOperatingSystems
MsgBox "你当前使用的系统是:" & objOperatingSystem.Caption
MsgBox "你当前的系统版本是:" & objOperatingSystem.Version
Next

Set colOperatingSystems = Nothing
Set objWMIService = Nothing
第11楼 kich 发表于 2007-04-14 00:28
中级用户 发帖 168 积分 397
强啊,谢谢楼上的啊!!
我的评分已经满了,呵呵
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023