Deseo modificar el siguiente script, para que la dirección IP única importada de un archivo de texto se pueda traducir al nombre de host en un archivo.CSV separado.

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

Entrada:

12.34.56.78
111.222.333.444
8.8.8.8

Salida:

12.34.56.78 - hosta.domain.com
111.222.333.444 - hostX.net
8.8.8.8 - something wrong
0
Senior Systems Engineer 29 ago. 2020 a las 17:19

1 respuesta

La mejor respuesta

Si sus archivos de entrada y salida son CSV, entonces debe utilizar los cmdlets *-Csv para importar y exportar archivos en formato CSV.

Supongo que desea entradas y salidas similares a las siguientes.

Entrada

ips.csv

12.34.56.78
111.222.333.444
8.8.8.8

Salida

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.

Demo

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

Explicación

  1. Importe el contenido de cada archivo CSV con Import-Csv, asegurándose de establecer un encabezado si el archivo CSV no tiene encabezados (parece ser el caso de su archivo de entrada).
  2. Cree una ruta de salida CSV. Puede decidir qué puede ser, pero algo como ips-hostnames.csv debería funcionar. Podemos usar { {X1}} con -LeafBase para obtener el nombre de archivo del CSV de entrada, luego combínelo con el directorio de salida para crear una ruta completa usando Join-Path.
  3. Cree un PSCustomObject para representar las columnas CSV de salida. Puede tener 2 columnas para sus direcciones IP y nombres de host.
  4. Utilice [System.Net.Dns]::GetHostEntry para resolver una IP en un nombre de host DNS, suponiendo que las búsquedas DNS inversas ya estén configuradas. Podemos envolver esto en un bloque try/catch para detectar una excepción si el método no pudo resolver el DNS y establecer la entrada del nombre de host en el mensaje de excepción.
  5. Exporte archivos CSV de salida con Export-Csv.
3
RoadRunner 31 ago. 2020 a las 09:35