2016-04-29 98 views
3

我有一个脚本用于循环访问一堆域,并从whois.exe获取日期。这可以一行一行地工作,但是当作为脚本运行时,它会冻结。这里是它卡住:Powershell脚本一行一行地在Powershell窗口中工作,但不在脚本中

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取消命令,我可以验证$域是正确的变量。然后我可以这样写:

if($domainname -like "*.org" -and $domainname) 
{ 
    "Test" 
} 

...并且“测试”出现在命令行中。然后我运行:

$date = .\WhoIs.exe -v "$domainname" | Select-String -Pattern "Registry Expiry Date: " -AllMatches 

检查日期后,它出来的权利,我得到相应的日期。鉴于它说冻结正确,因为它说“正在处理$域名...”,并在“域名是一个.org”之前,我只能假设WhoIs.exe冻结。那么,为什么会在脚本运行时发生这种情况,而不是直接从Powershell窗口中运行?

最后,我通过将整个脚本复制并粘贴到Powershell窗口(这很愚蠢,但它似乎起作用)并得到相同的结果,做了最后的测试。它冻结在whois.exe。

我最好的猜测是,whois.exe需要以不同的方式运行,以便在for-loop中的Powershell中可靠。但是,我似乎没有办法在Start-Process中使用它进行测试并获取字符串输出。

反正,劝告会很好。我一定打了一堵墙。

谢谢!

+1

您是否尝试过使用whois.exe的完整路径? –

+3

我想,你超出了允许的查询率。 – PetSerAl

回答

4

如果您的脚本在很多域中运行,那可能是您被限制了。下面是从Nominet的AUP报价:

最大查询速率是每秒5个查询以最大的每轧24小时1000个 查询。如果您超出查询限制,则会强制执行 。有关块的更多详细信息,请参阅 详细使用说明页。这些限制不是根据IP 地址,它们是每个用户。

http://registrars.nominet.org.uk/registration-and-domain-management/acceptable-use-policy

不同的注册行为可能不同,但是我希望某种速率限制。这可以解释为什么脚本(高容量)与特定手动查找的行为不同。


从下面的评论中提出的解决方案是将Start-Sleep -Seconds 1添加到每个Whois查找之间的循环中。

+2

这看起来极有可能。在循环内添加一个'Start-Sleep -Sec 1'可能会解决问题。如果是这样,你可以玩的时间来找到最佳的东西。 – TheMadTechnician

+0

的确如此。我不认为是这种情况,因为它只影响.org域名,睡眠定时器不起作用 - 我在我看到这个通知之前试过了。为了解决我的问题,我最终使用了没有费率限制的付费WhoIs服务,现在一切都按预期工作。我打算用睡眠定时器对WhoIs.exe应用程序做更多的测试,但我认为最终这不会是我所依赖的解决方案。谢谢! – jackmusick