导入IP列表,然后为每个IP地址解析DNS

时间:2020-08-29 14:19:24

标签: powershell

我希望修改以下脚本,以便从文本文件导入的唯一IP地址可以转换为单独的CSV文件中的主机名。

Get-ChildItem -Path C:\Logs\Input\ -Filter *.csv |
    Get-Content |
            Sort-Object -Unique | Sort -desc |
                Set-Content -Path C:\LOGS\Unique-$($ColumnNames).txt

输入:

12.34.56.78
111.222.333.444
8.8.8.8

输出:

12.34.56.78 - hosta.domain.com
111.222.333.444 - hostX.net
8.8.8.8 - something wrong

1 个答案:

答案 0 :(得分:3)

如果输入和输出文件是CSV,则应使用*-Csv cmdlet来导入和导出CSV格式的文件。

我假设您想要类似下面的输入和输出。

输入

ips.csv

12.34.56.78
111.222.333.444
8.8.8.8

输出

ips-hostnames.csv

IpAddress,HostName
12.34.56.78,hosta.domain.com
111.222.333.444,hostX.net
8.8.8.8,No such host is known.

演示

$inputDirectory = "C:\Input"
$outputDirectory = "C:\Output"

# Create output directory if it doesn't exist
if (-not(Test-Path -Path $outputDirectory -PathType Container)) {
    New-Item -Path $outputDirectory -ItemType Directory
}

# Go through each CSV file in input directory
foreach ($csv in Get-ChildItem -Path $inputDirectory -Filter *.csv -Recurse) {

    # Import CSV contents with IpAddress header
    $csvFile = Import-Csv -Path $csv.FullName -Header IpAddress

    # Get output path of CSV
    $csvName = Split-Path -Path $csv.FullName -LeafBase
    $csvOutputFileName = "{0}-{1}.csv" -f  $csvName, "hostnames"
    $csvOutputPath = Join-Path -Path $outputDirectory -ChildPath $csvOutputFileName
    
    # Export to CSV file with IpAddress & HostName headers
    & {
        foreach ($ip in $csvFile.IpAddress) {

            # Attempt to fetch DNS hostname
            try {
                [PSCustomObject]@{
                    IpAddress = $ip
                    HostName = [System.Net.Dns]::GetHostEntry($ip).HostName
                }
            }

            # Could not resolve DNS hostname
            catch {
                [PSCustomObject]@{
                    IpAddress = $ip
                    HostName = $_.Exception.InnerException.Message
                }
            }
        }
    } | Export-Csv -Path $csvOutputPath -NoTypeInformation -UseQuotes AsNeeded
}

说明

  1. Import-Csv导入每个CSV文件的内容,如果CSV文件没有标题(请确定您的输入文件就是这种情况),请确保设置一个标题。
  2. 创建CSV输出路径。您可以决定它可以是什么,但是应该可以使用ips-hostnames.csv之类的东西。我们可以将Split-Path-LeafBase结合使用来获取输入CSV的文件名,然后将其与输出目录结合使用Join-Path创建完整路径。
  3. 创建一个PSCustomObject来代表输出CSV列。您的IP地址和主机名可以包含2列。
  4. 假设已经配置了反向DNS查找,请使用[System.Net.Dns]::GetHostEntry将IP解析为DNS主机名。如果方法无法解析DNS,我们可以将其包装在try/catch块中以捕获异常,并将主机名条目设置为异常消息。
  5. 使用Export-Csv导出输出CSV文件。