Daniel Harper
Daniel Harper

Reputation: 23

How to Scan multiple Hostnames to resolve Ip addresses Powershell script

I am looking for some help with a script that will read a textfile full of server names and resolve the IP address and export this into a csv file. I am using powershell for this and the Test-Connection command. Please see below code - i am getting the error - cmdlet ForEach-Object at command pipeline position 1 Supply values for the following parameters:Process[0]:

(removed my username and swapped with ***)

$array=@()
$computer=Get-Content -Path c:\Users\****\Desktop\ping_IP_host\computers.txt
ForEach ($server in $computer){
if(Test-Connection $server -Quiet)
{
try {
$IP=
[System.net.dns]::GetHostEntry($server).AddressList | %
{$_.IpAddressTostring}
}
catch {"Invalid HostName" - $server}

$obj = New-Object PSObject -Property @{
    Hostname=$server
    IP=$IP
    }
$array += $obj

else {
$IP="Invalid Host"
}
$obj = New-Object PSObject -Property @{
    Hostname=$server
    IP=$IP
    }
$array += $obj
}
}
$array | Export-Csv C:\Users\****\Desktop\ping_IP_host\results.csv

Upvotes: 0

Views: 3395

Answers (1)

Mike L'Angelo
Mike L'Angelo

Reputation: 880

There is a misplace curly bracket, duplicated code, logic error and unwrapped objects.

Indenting properly will help you to find errors and duplicated code.

The custom object you build does contain both IPv4 and IPv6 addresses, so you may want to join the 2 addresses OR just select the IPv4 address - I do not know your requirements.

Edit:

The try..catch block is not needed as it depends on GetHostEntry() getting a result for the DNS lookup of $server, which is already verified by the test-connection. In short, your code defaults to the else clause "Invalid Host" when the host does not exist OR the host does not answer to ICMP. the try..catch block around $IP = ([System.net.dns]::GetHostEntry($server).AddressList should be located before the Test-Connection because an error means the host name is invalid so no point in trying a ping.

Note: The code below does not take into account the above edit.

Working code:

$array=@()
$computer=Get-Content -Path $env:userprofile\Desktop\ping_IP_host\computers.txt
ForEach ($server in $computer) {
    if (Test-Connection $server -Quiet -count 1) {
        try {
            $IP = ([System.net.dns]::GetHostEntry($server).AddressList | ForEach-Object {$_.IPAddressToString} ) -join ";"
        }
        catch {"Invalid HostName" - $server}
    }
    else {
        $IP="Invalid Host"
    }
    $obj = New-Object PSObject -Property @{
        Hostname = $server
        IP = $IP
    }
    $array += $obj
}

$array | Export-Csv -NoTypeInformation $env:userprofile\Desktop\ping_IP_host\results.csv

Output:

"IP","Hostname"
"216.58.206.68;2a00:1450:4002:803::2004","www.google.com"
"Invalid Host","jupiter"
"Invalid host","microsoft.com"

Select IPv4 address only

$array=@()
$computer=Get-Content -Path $env:userprofile\computers.txt
ForEach ($server in $computer) {
    if (Test-Connection $server -Quiet -count 1) {
        try {
            $IP = [System.net.dns]::GetHostEntry($server).AddressList | Where-Object {$_.AddressFamily -eq 'InterNetwork'} | ForEach-Object {$_.IPAddressToString}
        }
        catch {"Invalid HostName" - $server}
    }
    else {
        $IP="Invalid Host"
    }
    $obj = New-Object PSObject -Property @{
        Hostname = $server
        IP = $IP
    }
    $array += $obj
}

$array | Export-Csv -NoTypeInformation $env:userprofile\Desktop\ping_IP_host\results.csv

Output:

"IP","Hostname"
"216.58.206.68","www.google.com"
"Invalid Host","jupiter"
"Invalid host","microsoft.com"

Upvotes: 1

Related Questions