我有一个脚本,我用来遍历一堆域并从whois.exe获取日期。这是逐行的,但作为脚本运行时,它会冻结。这是它被卡住的地方:
ForEach ($domain in $domains)
{
$domainname = $domain.Name
Write-Host "Processing $domainname..."
# WhoIsCL responds with different information depending on if it's a .org or something else.
if($domainname -like "*.org" -and $domainname)
{
$date = .\WhoIs.exe -v "$domainname" | Select-String -Pattern "Registry Expiry Date: " -AllMatches
Write-Host "Domain is a .org" -ForegroundColor "Yellow"
当我按CTRL + C取消命令时,我可以验证 $ domain 是否是正确的变量。我可以写下这个:
if($domainname -like "*.org" -and $domainname)
{
"Test"
}
......和"测试"出现在命令行中。然后我跑:
$date = .\WhoIs.exe -v "$domainname" | Select-String -Pattern "Registry Expiry Date: " -AllMatches
检查日期后,它出来了,我得到了适当的日期。鉴于它冻结正确,因为它说"处理$ domainname ..."就在" Domain是.org"之前,我只能假设WhoIs.exe正在冻结。那么,为什么这会在脚本运行时发生,而不是直接从Powershell窗口发生?
最后,我通过简单地将整个脚本复制并粘贴到Powershell窗口(这只是愚蠢的,但似乎正常运行)进行了最终测试,并得到了相同的结果。它冻结在whois.exe上。
我最好的猜测是,在我的for循环中,whois.exe需要以不同的方式运行才能在Powershell中可靠。但是,我似乎没有办法在Start-Process中测试它并获得字符串输出。
无论如何,建议会很棒。我肯定碰壁了。
谢谢!
答案 0 :(得分:4)
如果您的脚本正在运行许多域,则可能是您受到限制。以下是Nominet AUP的引用:
最大查询率为每秒5次查询,最多为1,000次 每24小时滚动查询。如果超出查询限制块 将被强制执行。有关块的更多详细信息,请参阅 详细的使用说明页面。这些限制不是每个IP 地址,他们是每个用户。
http://registrars.nominet.org.uk/registration-and-domain-management/acceptable-use-policy
不同的注册商可能表现不同,但我期望某种速率限制。这可以解释为什么脚本(具有高音量)与ad-hoc手动查找的行为不同。
以下评论中提出的解决方案是将Start-Sleep -Seconds 1
添加到每个Whois查找之间的循环中。