Webアクセステスト自動実行スクリプト by PowerShell

複数のWebサイトへのアクセステストを自動実行、結果をCSVファイル出力するスクリプトをPowerShellで作成したので備忘兼ねて共有する。
スクリプト前段は、テスト日時、実行端末のPC名・ユーザ名、端末インターフェース・IP(LAN/WAN)、DNS設定、プロキシ設定を取得する。
スクリプト後段は、URLリストのファイルを読み込み、DNS名前解決IP、Invoke-WebRequestで得られるステータス情報、レスポンス値を取得してCSVファイルに書き込む。

##使用方法
①「web-acccess-test.ps1」と「url_list.csv」を同じフォルダ内に置く。
②「web-acccess-test.ps1」を右クリックして「PowerShellで実行」をクリック。
③テスト結果「Result-yyyyMMdd-HHmmss.csv」がフォルダ内に出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/aacdb918-4fc7-2a52-1cf0-d7cc77864c97.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/5373222a-b3c4-1efd-a9dd-2dc56b249e5c.png)

※上記結果は、Google関連のサイトで試した結果。「https://www.google.com/test」は実在しないページ。

##使用するスクリプトとURLリストファイル

```powershell:web-acccess-test.ps1
$FormatDate = (Get-Date).ToString("yyyyMMdd-HHmmss")
$FileName = "Result-" + $FormatDate + ".csv"
$outFile = ".\" + $FileName

"Test Date,$((Get-Date).ToString("yyyy/MM/dd-HH:mm:ss"))" | Out-File $outFile -encoding UTF8

$u= [System.Security.Principal.WindowsIdentity]::GetCurrent()
"Test PC\User,$($u.name)" | Out-File $outFile -encoding UTF8 -append

$TestNetCon = Test-NetConnection www.google.com
"Source Interface,$($TestNetCon.InterfaceAlias)" | Out-File $outFile -encoding UTF8 -append
"Source IP(LAN),$($TestNetCon.SourceAddress.IPAddress)" | Out-File $outFile -encoding UTF8 -append
"Source IP(WAN),$(Invoke-WebRequest -Uri "inet-ip.info/ip")" | Out-File $outFile -encoding UTF8 -append

$dns = Get-DnsClientServerAddress -InterfaceAlias  $TestNetCon.InterfaceAlias   -AddressFamily IPv4
"DNS Server,$($dns.ServerAddresses)" | Out-File $outFile -encoding UTF8 -append

New-PSDrive -PSProvider registry -Root HKEY_CURRENT_USER -Name HKCU
$BrowserSettings = Get-ItemProperty  -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
if($($BrowserSettings.ProxyEnable) -eq 1){
 $proxy = "Proxy Server,$($BrowserSettings.ProxyServer)"
}elseif($($BrowserSettings.AutoConfigURL) -is [string]){
 $proxy = "Proxy PAC,$($BrowserSettings.AutoConfigURL)"
}else{
 $proxy = "Proxy Setting,None"
}
$proxy | Out-File $outFile -encoding UTF8 -append

""  | Out-File $outFile -encoding UTF8 -append
"No,Test URL,Resolve IP,Status,Response Time"  | Out-File $outFile -encoding UTF8 -append
Get-Content $outFile

$urllist = Import-Csv ./url_list.csv
foreach ($urllist in $urllist)
{
  $ResolveIP =  (Resolve-DnsName ([System.Uri]"$($urllist.TestURL)").host -type A).IPAddress
  $csv = "$($urllist.No)," + "$($urllist.TestURL)," + "$($ResolveIP),"
  try {
    $ResponseTime = (Measure-Command -Expression {$w = Invoke-WebRequest -Uri $urllist.TestURL }).Milliseconds
    $csv += "$($w.StatusCode) " + "$($w.StatusDescription)," +"$($ResponseTime) msec"
  }catch [net.webException]{
    $err = $_.Exception.Response
    $csv += "$($_.Exception.Response.StatusCode.Value__) " + "$($_.Exception.Response.StatusDescription)," + "None (Web Access Problem!)"
  }
  $csv | Out-File $outFile -encoding UTF8 -append
  $csv
}
$csvFile = [System.IO.Directory]::GetCurrentDirectory() +"\"+ $FileName
Start-Process EXCEL.EXE $csvFile
```

```url_list.csv
No,TestURL
'01,https://www.google.com/
'02,https://www.google.co.jp/maps
'03,https://www.google.com/test
```

##参考サイト
（Invoke-WebRequestのエラーコード処理）
https://www.fixes.pub/program/225088.html
https://stackoverflow.com/questions/51198517/measure-response-time-using-invoke-webrequest-similar-to-curl
http://265.blog3.fc2.com/blog-entry-39.html

（Webサイトのアクセスレスポンス値取得）
https://stackoverflow.com/questions/51198517/measure-response-time-using-invoke-webrequest-similar-to-curl