Question

I have a script which reads a file of URL's and then performs a webrequest to check the status and latency of a list of site portals. We present this in a html table on an internal webserver. Our urls are not very meaningful to our business users I would like to create a new column in the table which shows the name of the site (http://10.x.x.x:8080/portal would be named 'Manchester')

Preferably reading in another file of names as each line of both files will match up

I have been doing this as a vanity project when I have a bit of free time in work but have limited knowledge.

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


    $a = Get-date

  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;
  }

  $SResult += [PSCustomObject] @{
   Store = $Store;
  }


}

    #Prepare email body in HTML format 
if($result -ne $null)
{ 
    $Outputreport = "<HTML><TITLE>Stores Web Portal Status</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Stores Web Portal Status $($a)</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 bgcolor=green>"
        }
        if($Entry.timetaken -ge "2600.000")
        { 
            $Outputreport += "<TR bgcolor=yellow>"
        }

        $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:\Scripts\Test.htm'
Was it helpful?

Solution

I recommend changing the source file to a CSV format that stores both the URI and the Name side-by-side. In concept, it would look something like this:

$csvText = @"
Uri,SiteName
http://10.0.0.1/foo,Foo
http://10.0.0.2/bar,Bar
"@

$siteRecords = ConvertFrom-Csv $csvText
$siteRecords

In practice, you would use Import-Csv to get the data from your file, and then you would have access to both properties when iterating.

$siteRecords = Import-Csv -Path $pathToYourCsvFile
foreach ($record in $siteRecords)
{
    $record.Uri
    $record.SiteName
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top