Check-BrokenLinks
Tired of using ‘System.Net.WebClient’ as I am? Upgrade to PowerShell v3 and use Invoke-WebRequest instead!
My first application of Invoke-WebRequest is to create a broken links checker for my website. Choose a webpage URI to scan, it will get all the links in it, and make a hit for each one.
<# .SYNOPSIS Check-BrokenLinks.ps1 - Runs a few SQL queries against an MS SQL database .DESCRIPTION Check-BrokenLinks.ps1 - Gets all the a href links on the specified URL and make a hit for each one to check the returned status code. .PARAMETER URL Defines the URL for which the links have to be checked Mandatory parameter No default value .NOTES File Name : Check-BrokenLinks.ps1 Author : Fabrice ZERROUKI - fabricezerrouki@hotmail.com .EXAMPLE PS D:\> .\Check-BrokenLinks.ps1 -URL www.zerrouki.com/about/ Gets all the a href links on the http://www.zerrouki.com/about/ page and make a hit for each one to check the returned status code. #> #requires -version 3.0 Param( [Parameter(Mandatory=$true, HelpMessage="You must provide a URL to analyze.")] $URL ) filter ColorPattern( [string]$Pattern, [ConsoleColor]$Color, [switch]$SimpleMatch ) { if( $SimpleMatch ) { $Pattern = [regex]::Escape( $Pattern ) } $split = $_ -split $Pattern $found = [regex]::Matches( $_, $Pattern, 'IgnoreCase' ) for( $i = 0; $i -lt $split.Count; ++$i ) { Write-Host $split[$i] -NoNewline Write-Host $found[$i] -NoNewline -ForegroundColor $Color } Write-Host } Clear-Host $linksList=(Invoke-WebRequest –Uri $URL).Links | Where-Object {$_.href -like “http*”} | Select-Object -ExpandProperty href -Unique $hash=@{} ForEach($link in $linksList) { Try { $status=Invoke-WebRequest –Uri $link -MaximumRedirection 0 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty StatusCode } Catch { $_ $status=$_ } $hash.Add($link,$Status) } $hash.GetEnumerator() | Sort Name | Format-Table @{Label="URL" ; Expression = {$_.Name}}, @{Label="Status Code" ; Expression = {$_.Value}} | Out-String | ColorPattern 200 DarkGreen