2015-11-03 9 views
1

Я пытаюсь взять список IP-адресов и разрешить их DNS-имя с помощью Powershell. Если хост не может решить, я пытаюсь записать его в файл ошибки. В настоящее время сценарий работает невероятно быстро (до 10 мс) на IP-адресах, способных разрешать имя хоста, но для тех, которые не разрешают сценарий, требуется длительный период времени (примерно 4500 мс на IP). Я попробовал синхронизацию только разрешения DNS на неразрешающих IP-адресах, и я получаю примерно 65 мс, когда они терпят неудачу, поэтому я не уверен, что добавляет это дополнительное время перетаскивания более 4000 мс к разрешению. Это становится очень интенсивным процессом синхронизации при обработке более 1000 IP-адресов. В приведенном ниже сценарии содержатся инструкции по измерениям, которые я использовал для поиска неисправностей.DNS Resolution Incredibly Slow

$ips = get-content ".\source_ip.txt" 
    $outFile = ".\resolvedTest.txt" 
    $errorFile = ".\resolveErrorTest.txt" 

    $commandTimes = @() 

    foreach ($ip in $ips){ 
     $measure = Measure-Command{ 
      try {[string] $hostname = [System.Net.Dns]::GetHostByAddress($ip).HostName} 
      catch [system.exception]{$hostname = $ip} 

      $hostname = $hostname.Replace("@{HostName=","") 
      $hostname = $hostname.Replace("}","") 

      if ($hostname -eq $ip){ 
       Add-Content $errorFile "$hostname, Error" 
      } else { 
       Add-Content $outFile "$ip, $hostname" 
      } 
     } 

     Write-Host $measure.TotalMilliseconds 
     $commandTimes += ,$measure.TotalMilliseconds 
    } 
+0

'[System.Net.DNS] :: GetHostByAddress ($ ip) .HostName' должен быть строкой. Кастинг [string] $ hostname не нужен. Две строки, использующие '.Replace()', не нужны. Удаление их поможет со скоростью, но, скорее всего, это не проблема. Это обратный DNS, поэтому нет встроенных командлетов, которые, как я знаю, будут делать это и, надеюсь, включать таймаут. Кроме того, вы можете удалить структуру if и переместить часть ошибки в блок catch вместо части, которая устанавливает $ hostname и перемещает выходную часть. вы получите «try {}; catch {}; Add-content ....' – Xalorous

ответ

0

Я попытался удалить ненужные заявления:

$ips = "127.0.0.1", "127.0.0.1" 
$outFile = "c:\resolvedTest.txt" 
$errorFile = "c:\resolveErrorTest.txt" 

foreach ($ip in $ips){ 

    $measure = Measure-Command { 
     try { 
      $hostname = [System.Net.Dns]::GetHostByAddress($ip).HostName 
     } 
     catch { 
      $hostname = $false 
     } 
    } 

    if($hostname) { 
     Write-Host ("$ip was successfully resolved to $hostname ({0:N0}ms elapsed)" -f $measure.TotalMilliseconds) -ForegroundColor Green 
    } else { 
     Write-Host ("$ip was not resolved ({0:N0}ms elapsed)" -f $measure.TotalMilliseconds) -ForegroundColor Red 
    } 

} 

Не знаю, если это будет быстрее, хотя.