Board logo

标题: [问题求助] 求助 使用vbs删除host文件域址内容 [打印本页]

作者: a000001    时间: 2015-9-17 01:57     标题: 求助 使用vbs删除host文件域址内容

本帖最后由 a000001 于 2015-9-21 11:06 编辑
  1. '该脚本要求执行用户有本地管理员权限
  2. Const ForReading = 1, ForWriting = 2, ForAppending = 8, ReadOnly = 1
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. Set WshShell=CreateObject("WScript.Shell")
  5. 'WinDir 为windows安装目录
  6. WinDir =WshShell.ExpandEnvironmentStrings("%WinDir%")
  7. '设定host 文件目录
  8. HostsFile = WinDir & "\System32\Drivers\etc\Hosts"
  9. '检查host文件是否为只读,如为只读,则修改文件属性
  10. Set objFSO = CreateObject("Scripting.FileSystemObject")
  11. Set objFile = objFSO.GetFile(HostsFile)
  12. If objFile.Attributes And ReadOnly Then
  13.   objFile.Attributes = objFile.Attributes Xor ReadOnly
  14. End If
  15. Set objFSO = CreateObject("Scripting.FileSystemObject")
  16. Set objFile = objFSO.OpenTextFile(HostsFile, ForReading,true)
  17. '检查host文件里面是否已经更改过了,如果更改过,则不再执行脚本
  18. hostfileline=""
  19. Do Until objFile.AtEndOfStream
  20. strline = objfile.ReadLine
  21. If InStr (strline, "202.102.101.105") <> 0 Or (InStr (strline, "202.102.101.107"))<>0 Or (InStr (strline, "202.102.101.108"))   Then
  22.    strline=""
  23. End If
  24.    hostfileline=hostfileline+vbCrLf+strline
  25. Loop
  26. WScript.Echo hostfileline
  27. objFile.Close
  28. '修改host文件
  29. Set filetxt = fso.OpenTextFile(HostsFile, ForWriting )
  30. filetxt.Write hostfileline
  31. filetxt.Close
  32. WScript.Quit
复制代码
原先host里面已增加以下3行

202.102.101.105 intranet.corp
202.102.101.107 mail.intranet.corp
202.102.101.108 sip.intranet.corp

之后不需要此3行内容,所以运行以上vbs代码,来删除host文件此3行

但是此vbs代码有些问题:

1.添加需删除的网域只能在同一行;
   例如: If InStr (strline, "202.102.101.105") <> 0 Or (InStr (strline, "202.102.101.107".....
   如果写成两行则vbs运行错误  
   vbs代码如何换下一行,才会运行成功?

2.此vbs代码运行时,会有提示画面,
   如何改写代码,让它无提示画面?

3.此vbs代码运行后,开启hosts,
   会发现hosts的最顶端会多出一个空白行,最尾端则多出许多空白行
   此问题该如何解决?
作者: pcl_test    时间: 2015-9-17 11:15

  1. '该脚本要求执行用户有本地管理员权限
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set fd = fso.GetSpecialFolder(1)
  4. HostsFile = fd & "\Drivers\etc\Hosts"
  5. Set objFile = fso.GetFile(HostsFile)
  6. If objFile.Attributes And 1 Then
  7.     objFile.Attributes = objFile.Attributes -1
  8. End If
  9. Set f = fso.OpenTextFile(HostsFile, 1)
  10. tmp = f.ReadAll
  11. If InStr (tmp, "202.102.101.105") <> 0 Then
  12.     Set regEx = New RegExp
  13.     regEx.Global = True
  14.     regEx.Pattern = "[^\r\n]*202\.102\.101\.(105|107|108).+[\r\n]?"
  15.     txt = regex.replace(tmp,"")
  16.     Set regEx = Nothing
  17.     f.Close
  18.     Set f = fso.OpenTextFile(HostsFile, 2)
  19.     f.Write txt
  20.     f.Close
  21. End If
复制代码

作者: a000001    时间: 2015-9-17 12:47

pcl_test 发表于 2015-9-17 11:15


如果要删除以下各种不同域址,代码该如何改写?


127.0.0.1 mcfg.sandai.net
127.0.0.1 211.94.190.80
127.0.0.1 advstat.xunlei.com
123.87.86.5 biz5.sandai.net
527.66.13.125 cknum.sandai.net
110.45.215.113 cl.kankan.xunlei.com
127.0.0.1 float.sandai.net
127.0.0.1 mcfg.sandai.net
180.70.134.154 mtips.xunlei.com
127.0.0.1 pubstat.sandai.net
216.58.221.74 recommend.xunlei.com
127.0.0.1 wy.xunlei.com
110.45.229.148 buy.safe.xunlei.com
作者: pcl_test    时间: 2015-9-17 13:09

回复 3# a000001

这样的事当然用批处理
  1. @echo off
  2. >"%tmp%\$" more +7 %0
  3. set "fd=%windir%\System32\Drivers\etc"
  4. attrib -r "%fd%\hosts"
  5. findstr /v /g:"%tmp%\$" "%fd%\hosts">"%fd%\$"
  6. move "%fd%\$" "%fd%\hosts"
  7. pause&exit
  8. 127.0.0.1 mcfg.sandai.net
  9. 127.0.0.1 211.94.190.80
  10. 127.0.0.1 advstat.xunlei.com
  11. 123.87.86.5 biz5.sandai.net
  12. 527.66.13.125 cknum.sandai.net
  13. 110.45.215.113 cl.kankan.xunlei.com
  14. 127.0.0.1 float.sandai.net
  15. 127.0.0.1 mcfg.sandai.net
  16. 180.70.134.154 mtips.xunlei.com
  17. 127.0.0.1 pubstat.sandai.net
  18. 216.58.221.74 recommend.xunlei.com
  19. 127.0.0.1 wy.xunlei.com
  20. 110.45.229.148 buy.safe.xunlei.com
复制代码

作者: a000001    时间: 2015-9-17 14:16

回复  a000001

这样的事当然用批处理
pcl_test 发表于 2015-9-17 13:09


vbs没法子办到吗? 因为不希望有黑视窗闪现,所以才考虑用vbs....
作者: pcl_test    时间: 2015-9-17 21:08

回复 5# a000001
  1. On Error Resume Next
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set dict = CreateObject("Scripting.Dictionary")
  4. Set f = fso.OpenTextFile(wscript.scriptfullname, 1)
  5. Do Until f.AtEndOfStream
  6.     str = Trim(f.ReadLine)
  7.     IF Left(str,1)="'" Then dict.Add mid(str,2), "1"
  8. Loop
  9. f.Close
  10. Set fso = CreateObject("Scripting.FileSystemObject")
  11. Set fd = fso.GetSpecialFolder(1)
  12. HostsFile = fd & "\Drivers\etc\Hosts"
  13. Set objFile = fso.GetFile(HostsFile)
  14. If objFile.Attributes And 1 Then
  15.     objFile.Attributes = objFile.Attributes -1
  16. End If
  17. Set f = fso.OpenTextFile(HostsFile, 1)
  18. Do Until f.AtEndOfStream
  19.     str = f.ReadLine
  20.     If not dict.Exists(Trim(str)) Then
  21.     txt = txt & str & vbCrLf
  22. End If
  23. Loop
  24. f.Close
  25. Set f = fso.OpenTextFile(HostsFile, 2)
  26. f.Write txt
  27. f.Close
  28. '127.0.0.1 mcfg.sandai.net
  29. '127.0.0.1 211.94.190.80
  30. '127.0.0.1 advstat.xunlei.com
  31. '123.87.86.5 biz5.sandai.net
  32. '527.66.13.125 cknum.sandai.net
  33. '110.45.215.113 cl.kankan.xunlei.com
  34. '127.0.0.1 float.sandai.net
  35. '180.70.134.154 mtips.xunlei.com
  36. '127.0.0.1 pubstat.sandai.net
  37. '216.58.221.74 recommend.xunlei.com
  38. '127.0.0.1 wy.xunlei.com
  39. '110.45.229.148 buy.safe.xunlei.com
复制代码

作者: a000001    时间: 2015-9-18 12:27

本帖最后由 a000001 于 2015-9-18 12:31 编辑
回复  a000001
pcl_test 发表于 2015-9-17 21:08


版主 真是高人~~
vbs真的可以运行

昨日发现一个使用上的问题,情形如下:

原本hosts内容:
203.208.39.104 lh1.ggpht.com
127.0.0.1 wy.xunlei.com
203.208.25.104 netkuu.ku6.com
203.28.42.104 netkuu.letv.com

添加之后的hosts内容:

203.208.39.104 lh1.ggpht.com
127.0.0.1 wy.xunlei.com       ----------------->此域名重复-->(1)
203.208.25.104 netkuu.ku6.com
203.28.42.104 netkuu.letv.com
#新域名
127.0.0.1 mcfg.sandai.net
127.0.0.1 211.94.190.80
127.0.0.1 advstat.xunlei.com
127.0.0.1 wy.xunlei.com        ----------------->此域名重复-->(2)



可以发现127.0.0.1 wy.xunlei.com此域名重复2次,

此时运行版主提供的vbs或bat,

其结果都是将重复的域名全部删除.

对于重复的域名如何能够只删除一次,其他剩余重复的域名全保留?

是否可以做到只删除新增的域名(2),其他旧的重复域名全保留?
作者: pcl_test    时间: 2015-9-18 12:40

回复 7# a000001


    嗯,你添加新的域名时先检测是否已存在,是就不添加;或者,两个都保留,不删就是
作者: a000001    时间: 2015-9-18 14:49

回复  a000001


    嗯,你添加新的域名时先检测是否已存在,是就不添加;或者,两个都保留,不删就是
pcl_test 发表于 2015-9-18 12:40


对于 添加多个新的域名先检测:

一次添加多个新的域名时先检测是否已存在,是就不添加 -->  批处理(.bat) 有办法做到吗?



另外删除域名方面:

对于多个要删除的域名, 是否有办法先检测出重复的域名,只删除其中一个;

其他要删除的域名如果没有检测出重复的域名,则直接删除

-->  vbs 或 批处理(.bat) 有办法做到吗?
作者: pcl_test    时间: 2015-9-18 15:18

回复 9# a000001

嗯,可以,别问我怎么做到
作者: a000001    时间: 2015-9-18 23:34

回复  a000001

嗯,可以,别问我怎么做到
pcl_test 发表于 2015-9-18 15:18


真是抱歉 让您费心写代码

对于 批处理(.bat) 添加多个新的域名先检测
我另发个新帖 批处理(.bat) 添加多个新的域名到hosts需先检测

http://www.bathome.net/thread-37372-1-1.html


另外上面给的批处理,会在%tmp%之内残留一个$档

可以批处理在运行完时,自动删除$档?
  1. @echo off
  2. >"%tmp%\$" more +7 %0
  3. set "fd=%windir%\System32\Drivers\etc"
  4. attrib -r "%fd%\hosts"
  5. findstr /v /g:"%tmp%\$" "%fd%\hosts">"%fd%\$"
  6. move "%fd%\$" "%fd%\hosts"
  7. pause&exit
  8. 127.0.0.1 mcfg.sandai.net
  9. 127.0.0.1 211.94.190.80...
复制代码

作者: pcl_test    时间: 2015-9-18 23:36

回复 11# a000001

del /q "%tmp%\$"
pause&exit
作者: a000001    时间: 2015-9-19 00:02

回复  a000001

del /q "%tmp%\$"
pause&exit
pcl_test 发表于 2015-9-18 23:36



使用vbs或bat 对于多个要删除的域名, 是否有办法先检测出重复的域名,只删除其中一个;

其他要删除的域名如果没有检测出重复的域名,则直接删除

--> 跪求vbs 和 批处理(.bat) 代码 ~~
作者: pcl_test    时间: 2015-9-19 00:10

回复 13# a000001

都可以,别问我怎么做到
作者: a000001    时间: 2015-9-19 02:07

本帖最后由 a000001 于 2015-9-19 08:39 编辑

传讯说已解决 一直传讯说已解决 真的已解决?  

很感激他人耗费心思来协助

但目前的代码运行下去 对于旧有的重复域名 会造成误删

求大神们帮忙了




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