Powershell脚本逐行工作在Powershell窗口,但不在脚本中

时间:2016-04-29 20:09:34

标签: powershell

我有一个脚本,我用来遍历一堆域并从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中测试它并获得字符串输出。

无论如何,建议会很棒。我肯定碰壁了。

谢谢!

1 个答案:

答案 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查找之间的循环中。