2013-08-29 3 views
3

Я видел несколько вопросов, подобных этому, но не нашел того, который будет работать для моей ситуации.Сценарий проверки статуса URL-адреса

У меня есть список URL-адресов, хранящихся в текстовом файле, который мне нужно выполнить, чтобы узнать, возвращают ли они ошибку 404. Я использую powershell и использую пример здесь: http://gallery.technet.microsoft.com/scriptcenter/Powershell-Script-for-13a551b3#content

В настоящее время я тестирую ссылку на страницу слияния, наблюдая за консолью в Chrome. Я вижу, что первый возвращенный статус - это 404 - Not Found, а затем дюжина или так далее запросы, которые являются 304, 200.

Я угадываю запросы после того, как первые 404 повлияли на мои результаты, мне нужен сценарий для возврата на основе этого первого ответа.

Я пробовал powershell, php и javascript решения, не повезло до сих пор.

Итак, есть ли способ вернуть ответ, основанный на первом ответе?

Сценарий:

## The URI list to test 
$URLListFile = "H:\xxx\xxx\urlList.txt" 
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue 
    $Result = @() 


    Foreach($Uri in $URLList) { 
    $time = try{ 
    $request = $null 
    ## Request the URI, and measure how long the response took. 
    $result1 = Measure-Command { $request = Invoke-WebRequest -Uri $uri } 
    $result1.TotalMilliseconds 
    } 
    catch 
    { 
    <# If the request generated an exception (i.e.: 500 server 
    error or 404 not found), we can pull the status code from the 
    Exception.Response property #> 
    $request = $_.Exception.Response 
    $time = -1 
    } 
    $result += [PSCustomObject] @{ 
    Time = Get-Date; 
    Uri = $uri; 
    StatusCode = [int] $request.StatusCode; 
    StatusDescription = $request.StatusDescription; 
    ResponseLength = $request.RawContentLength; 
    TimeTaken = $time; 
    } 

} 
    #Prepare email body in HTML format 
if($result -ne $null) 
{ 
    $Outputreport = "<HTML><TITLE>Website Availability Report</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Availability Report </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B></TD><TD><B>StatusCode</B></TD><TD><B>StatusDescription</B></TD><TD><B>ResponseLength</B></TD><TD><B>TimeTaken</B></TD</TR>" 
    Foreach($Entry in $Result) 
    { 
     if($Entry.StatusCode -ne "200") 
     { 
      $Outputreport += "<TR bgcolor=red>" 
     } 
     else 
     { 
      $Outputreport += "<TR>" 
     } 
     $Outputreport += "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD><TD align=center>$($Entry.StatusDescription)</TD><TD align=center>$($Entry.ResponseLength)</TD><TD align=center>$($Entry.timetaken)</TD></TR>" 
    } 
    $Outputreport += "</Table></BODY></HTML>" 
} 

$Outputreport | out-file H:\xxx\xxx\test.htm 
Invoke-Expression H:\xxx\xxx\test.htm 
+0

Можете ли вы опубликовать свой сценарий powershell, который вы пытаетесь? – Mitul

+0

Итак, вы хотите, чтобы сценарий останавливался, как только он достигал одной ошибки? –

ответ

6

Если вы хотите, чтобы ваш сценарий выхода из цикла после первой ошибки, вы можете попробовать что-то вроде этого:

Foreach($Uri in $URLList) { 
    $error.Clear() 

    $time = Measure-Command { $request = Invoke-WebRequest -Uri $uri } 2>$null 

    if ($error.Count -eq 0) { 
    $time.TotalMilliseconds 
    } else { 
    $error[0].Exception.Response 
    break 
    } 
} 

AFAICS try..catch не нужны здесь ,

Смежные вопросы