标题: [问题求助] 求助 使用vbs删除host文件域址内容 [打印本页]
作者: a000001 时间: 2015-9-17 01:57 标题: 求助 使用vbs删除host文件域址内容
本帖最后由 a000001 于 2015-9-21 11:06 编辑
- '该脚本要求执行用户有本地管理员权限
- Const ForReading = 1, ForWriting = 2, ForAppending = 8, ReadOnly = 1
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set WshShell=CreateObject("WScript.Shell")
- 'WinDir 为windows安装目录
- WinDir =WshShell.ExpandEnvironmentStrings("%WinDir%")
- '设定host 文件目录
-
- HostsFile = WinDir & "\System32\Drivers\etc\Hosts"
- '检查host文件是否为只读,如为只读,则修改文件属性
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- Set objFile = objFSO.GetFile(HostsFile)
- If objFile.Attributes And ReadOnly Then
- objFile.Attributes = objFile.Attributes Xor ReadOnly
- End If
-
-
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- Set objFile = objFSO.OpenTextFile(HostsFile, ForReading,true)
-
- '检查host文件里面是否已经更改过了,如果更改过,则不再执行脚本
- hostfileline=""
- Do Until objFile.AtEndOfStream
-
- strline = objfile.ReadLine
- If InStr (strline, "202.102.101.105") <> 0 Or (InStr (strline, "202.102.101.107"))<>0 Or (InStr (strline, "202.102.101.108")) Then
- strline=""
- End If
- hostfileline=hostfileline+vbCrLf+strline
- Loop
- WScript.Echo hostfileline
- objFile.Close
-
-
- '修改host文件
- Set filetxt = fso.OpenTextFile(HostsFile, ForWriting )
- filetxt.Write hostfileline
- filetxt.Close
- 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
- '该脚本要求执行用户有本地管理员权限
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set fd = fso.GetSpecialFolder(1)
- HostsFile = fd & "\Drivers\etc\Hosts"
-
- Set objFile = fso.GetFile(HostsFile)
- If objFile.Attributes And 1 Then
- objFile.Attributes = objFile.Attributes -1
- End If
-
-
- Set f = fso.OpenTextFile(HostsFile, 1)
- tmp = f.ReadAll
- If InStr (tmp, "202.102.101.105") <> 0 Then
- Set regEx = New RegExp
- regEx.Global = True
- regEx.Pattern = "[^\r\n]*202\.102\.101\.(105|107|108).+[\r\n]?"
- txt = regex.replace(tmp,"")
- Set regEx = Nothing
- f.Close
- Set f = fso.OpenTextFile(HostsFile, 2)
- f.Write txt
- f.Close
- 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
这样的事当然用批处理- @echo off
- >"%tmp%\$" more +7 %0
- set "fd=%windir%\System32\Drivers\etc"
- attrib -r "%fd%\hosts"
- findstr /v /g:"%tmp%\$" "%fd%\hosts">"%fd%\$"
- move "%fd%\$" "%fd%\hosts"
- pause&exit
- 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
复制代码
作者: 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 - On Error Resume Next
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set dict = CreateObject("Scripting.Dictionary")
- Set f = fso.OpenTextFile(wscript.scriptfullname, 1)
- Do Until f.AtEndOfStream
- str = Trim(f.ReadLine)
- IF Left(str,1)="'" Then dict.Add mid(str,2), "1"
- Loop
- f.Close
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set fd = fso.GetSpecialFolder(1)
- HostsFile = fd & "\Drivers\etc\Hosts"
-
- Set objFile = fso.GetFile(HostsFile)
- If objFile.Attributes And 1 Then
- objFile.Attributes = objFile.Attributes -1
- End If
-
- Set f = fso.OpenTextFile(HostsFile, 1)
- Do Until f.AtEndOfStream
- str = f.ReadLine
- If not dict.Exists(Trim(str)) Then
- txt = txt & str & vbCrLf
- End If
- Loop
- f.Close
- Set f = fso.OpenTextFile(HostsFile, 2)
- f.Write txt
- f.Close
-
- '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
- '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
复制代码
作者: 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%之内残留一个$档
可以批处理在运行完时,自动删除$档?- @echo off
- >"%tmp%\$" more +7 %0
- set "fd=%windir%\System32\Drivers\etc"
- attrib -r "%fd%\hosts"
- findstr /v /g:"%tmp%\$" "%fd%\hosts">"%fd%\$"
- move "%fd%\$" "%fd%\hosts"
- pause&exit
- 127.0.0.1 mcfg.sandai.net
- 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 |