我编写了一个 Powershell 脚本,在运行时更新主机文件:添加条目、清除条目。
我正在做的事情的一个例子:
Import-Module 'Carbon'
#Carbon module functions
Reset-HostsFile
#No exception expected
$result = Invoke-Webrequest -Uri "https://blogs.technet.microsoft.com" -UseBasicParsing
$result = $null
#No exception expected
$result = Invoke-Webrequest -Uri "https://www.google.fr" -UseBasicParsing
$result = $null
#No exception expected
$result = Invoke-Webrequest -Uri "http://www.lequipe.fr" -UseBasicParsing
$result = $null
#Block google.fr
Set-HostsEntry -IPAddress 0.0.0.0 -HostName 'google.fr www.google.fr' -Description "Google"
#No exception expected
$result = Invoke-Webrequest -Uri "https://blogs.technet.microsoft.com" -UseBasicParsing
$result = $null
#No exception expected
$result = Invoke-Webrequest -Uri "https://www.google.fr" -UseBasicParsing
$result = $null
#Exception expected
$result = Invoke-Webrequest -Uri "http://www.lequipe.fr" -UseBasicParsing
$result = $null
#Block lequipe.fr
Set-HostsEntry -IPAddress 0.0.0.0 -HostName 'lequipe.fr www.lequipe.fr' -Description "Google"
#No exception expected
$result = Invoke-Webrequest -Uri "https://blogs.technet.microsoft.com" -UseBasicParsing
$result = $null
#No exception expected
$result = Invoke-Webrequest -Uri "https://www.google.fr" -UseBasicParsing
$result = $null
#Exception expected
$result = Invoke-Webrequest -Uri "http://www.lequipe.fr" -UseBasicParsing
$result = $null
Reset-HostsFile
#No exception expected
$result = Invoke-Webrequest -Uri "https://blogs.technet.microsoft.com" -UseBasicParsing
$result = $null
#No exception expected
$result = Invoke-Webrequest -Uri "https://www.google.fr" -UseBasicParsing
$result = $null
#No exception expected
$result = Invoke-Webrequest -Uri "http://www.lequipe.fr" -UseBasicParsing
$result = $null
当预期出现异常时,不会抛出任何异常。这是因为我仍然在相同的 Powershell 环境中运行。如果我打开一个新的 shell 来调用 Invoke-Webrequest,并且 uri 被阻止,则会抛出异常。
碳模块可以在这个地址找到:http://get-carbon.org/ 所用功能没有什么特别之处。在使用 Carbon 之前,我使用 Powershell cmdlet Clear-Content 和 Add-Content 更新 hosts 文件。问题已经存在。
我实施的解决方案是使用以下代码创建一个作业:
$job = Start-Job –Scriptblock { Invoke-Webrequest -Uri "https://www.google.fr" -UseBasicParsing }
Wait-Job $job
Receive-Job $job -OutVariable result
$result
但这个解决方案并不干净,它创建了一个后台工作者。
有没有办法在不关闭/打开 powershell 的情况下“刷新” powershell 环境。我试过了:
- ipconfig /flushdns
- ARP-A
- netsh 接口 ip 删除 arpcache
最后,代码将使用 Windows 计划任务运行。
谢谢你的支持。Vinc3nt