やりたいこと
大量のホスト名に対して、名前解決してIPv4アドレスを取得して、一覧をCSVにしたい。
環境はWindows7標準のPowerShell 2.0。
コード
nslookuplist.ps1
# nslookupしたいホスト名を
# www.yahoo.co.jp
# www.google.co.jp
# のようにファイルにリスト化しておく。ここではファイル名「hostnames.txt」。
$hostnames = (cat "hostnames.txt") # ★1
# 配列の定義(初期でヘッダの設定)
$rows = @("hostname,ip")
$ips = @()
$result = $false
foreach ($hostname in $hostnames) {
try {
# IPv4アドレスのみ取得
$ips = [System.Net.Dns]::GetHostAddresses($hostname) | ? { $_.AddressFamily -eq "InterNetwork" }
} catch [Exception] {
# 名前解決できなかったら空欄
$ips = @("")
}
foreach ( $ip in $ips) {
# 1行の結果をカンマ区切りで追記
$rows += $hostname + "," + $ip
}
}
# result.csv に結果をCSVで出力する
$rows | ConvertFrom-Csv | Export-Csv "result.csv" -NoTypeInformation # ★2
<おまけ1>
★1の箇所で対象ホスト名を別のファイルにしておくのが面倒なときは
以下のように定義します。
★1の箇所をコード内で定義する場合
$hostnames = @"
www.yahoo.co.jp
www.google.co.jp
"@ -split "`r`n"
<おまけ2>
★2の箇所でファイルに出力せず、
グリッドビュー(結果例は後述)に表示したい場合は以下のようにします。
★2の箇所をグリッドビューで表示する場合
$rows | ConvertFrom-Csv | Out-GridView
結果例
result.csv
"hostname","ip"
"www.yahoo.co.jp","183.79.75.234"
"www.yahoo.co.jp","183.79.43.200"
"www.yahoo.co.jp","183.79.139.228"
"www.yahoo.co.jp","118.151.235.191"
"www.google.co.jp","216.58.197.195"
★2の箇所でグリッドビューに表示するようにした場合は以下のようになります。
以上です。