中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [VBS]slore,baomaboy兄帮我看下我注册表右键出错为什么?
作者:
标题: [VBS]slore,baomaboy兄帮我看下我注册表右键出错为什么? 上一主题 | 下一主题
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『楼 主』:  [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 ]

2007-4-12 02:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 2 楼』:  

晕,自己解决了!!
是因为已经删除过一次,再删除就不行了!!
如果用 On Error Resume Next 在前面就OK了!!
但我记得右键始终是在的啊,所以误以为没删除掉!
不知道怎么混乱了!!
是不是删除后,文件夹要重新开,注册表起的作用才会起作用啊>??

我设置右键是作用在文件夹上的!!

2007-4-12 11:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 3 楼』:  



  Quote:
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 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 kich 分数: +2  时间:2007-4-13 06:57




好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-13 01:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 4 楼』:  



  Quote:
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删除注册表必须按由末级向上层层删除,看你的代码也不存在此问题。但也许你的注册表父项继承权限特殊或者你在那个注册表项下还建了其他项呢 。

我没你的环境 不能准确告诉你 以上权当参考 也许还有其他我没想到的原因。



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-13 03:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 5 楼』:  

原来你是 连续两次删除 造成删除一个没有的值而出错的
但怎么回有你所说的混乱呢 点第一次时有菜单→卸载删除→点第二次右键 应该无菜单了 除非你能做到 卸载删除 过程中保持第一次的右键菜单。

[ Last edited by baomaboy on 2007-4-13 at 03:51 AM ]



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-13 03:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 6 楼』:  

呵呵,当时程序刚编写完!出错在哪我也不大记得了,就记得当时怎么删右键都删不掉!!
有点纳闷!!

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

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

[ Last edited by kich on 2007-4-13 at 06:56 AM ]

2007-4-13 06:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by kich at 2007-4-13 06:54:
呵呵,当时程序刚编写完!出错在哪我也不大记得了,就记得当时怎么删右键都删不掉!!
有点纳闷!!

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

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

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

下面 结束并重启explorer
If WinVer("OS") <> "Windows_NT" Then
WshSHell.Run ("RUNDLL32 SHELL32.DLL,SHExitWindowsEx -1"), vbHide''适应于Win9x
Else
For Each Process In Getobject("winmgmts:"). _
ExecQuery ("Select * from Win32_Process where name='explorer.exe'")''适应于WinNt
Process.terminate(0)
Next
WScript.Sleep 3000
For Each ps In Getobject _
("winmgmts:\\.\root\cimv2:win32_process").instances_
If Lcase(ps.name)="explorer.exe" Then''NT系统下我遇到过未知原因引起的explorer结束后不能启动的现象,所以延时检查explorer进程无则新建。
Set WshSHell = Nothing
Set FSO = Nothing
Set Args = Nothing
WScript.Quit(0)
Exit For
End If
Next
WshSHell.Run ("explorer.exe")
End If


   此帖被 +2 点积分    点击查看详情   
评分人:【 kich 分数: +2  时间:2007-4-13 10:53




好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-13 07:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 8 楼』:  

哦,谢谢啊,这下:HKCR\lnkfile\IsShortcut 这个对了!是建到右边去了,多谢指导!!

还有,[ If WinVer("OS") <> "Windows_NT" Then ]
If WinVer("OS")  可以直接用吗?
WinVer可以??OS什么东东,也可以直接用吗?
没见过!!不好意思,劳驾!!
Thx

2007-4-13 10:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by kich at 2007-4-13 10:56:
哦,谢谢啊,这下:HKCR\lnkfile\IsShortcut 这个对了!是建到右边去了,多谢指导!!

还有,[ If WinVer("OS") <> "Windows_NT" Then ]
If WinVer("OS&quo ...

Set WinVer = WshSHell.Environment("Process")



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-13 11:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 10 楼』:  

还可以使用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

2007-4-13 11:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 11 楼』:  

强啊,谢谢楼上的啊!!
我的评分已经满了,呵呵

2007-4-14 00:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: