PowerShell Exportando para CSV / Workflow?

3

Quando o servidor é ping'd, o endereço resultante é comparado a um inventário para fins de manter o inventário atualizado.

Estou tentando colocar o resultado como "bom" ou "ruim" na próxima célula correspondente. Isso funciona, exceto que o resultado é sempre "ruim" com o fluxo de trabalho que eu configurei.

O CSV contém o nome do servidor e o endereço IP extraídos de um inventário do Excel e é formatado assim:

name,ipaddress
server1,10.1.24.51
server2,10.1.24.52
server3,10.1.24.53
server4,10.1.27.101
server5,10.1.27.102 <--- purposely wrong IP address for testing

script atual:

$serverlist = Import-Csv -Path file.csv

ForEach ($server in $serverlist) {

    $thisservername = $server.name
    $thisserveripaddress = $server.ipaddress

    $pingdaddress = (Test-Connection -ComputerName $thisservername -Count 1 -ErrorAction SilentlyContinue -Verbose).IPV4Address.IPAddressToString

    if ($pingdaddress -ne $thisserveripaddress) {

        #$thisservername + " bad"
        $serverlist | Select-Object name,ipaddress, @{Name='connection';Expression={'bad'}} | '
        Export-Csv -Path file.csv -NoTypeInformation

    } else {

        #$thisservername + " good"
        $serverlist | Select-Object name,ipaddress, @{Name='connection';Expression={'good'}} | '
        Export-Csv -Path file.csv -NoTypeInformation

    }

}
    
por gxd103 27.06.2017 / 22:05

1 resposta

5

Acho que o seu erro está na origem de $pingdaddress = (Test-Connection -ComputerName $thisservername -Count 1 -ErrorAction SilentlyContinue -Verbose).IPV4Address.IPAddressToString . Se o nome do servidor não puder ser resolvido, o objeto de conexão (bem, objeto Win32_PingStatus) retornado por Test-Connection será $null . Você está tentando acessar uma propriedade em um objeto nulo, o que não é permitido.

Eu dividiria a parte "sucesso" em sua própria coluna. Você pode fazer isso adicionando outra coluna ao seu CSV, por exemplo: NameMatch ou IPMatch , o que fizer mais sentido para você. Dessa forma, você pode acessá-lo como uma propriedade em seu loop $server.NameMatch e filtrar / classificar os dados posteriormente.

function Test-ServerNameMapping
{

    [cmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateScript({Test-Path $_})]
        [String]
        $Path
    )

    $serverList = Import-Csv -Path $Path

    foreach ($server in $serverList)
    {
        Write-Verbose "Testing: $($server.Name), $($server.IPAddress)"

        $connectionObject = (Test-Connection -ComputerName $server.Name -Count 1 -ErrorAction SilentlyContinue)

        if (-not $connectionObject)
        {
            Write-Verbose "Failed to resolve $($server.Name) to an IP address."
            $server.namematch = $false
        }
        else
        {
            $resolvedAddress = $connectionObject.IPV4Address.ToString()
            Write-Verbose "Resolved $($server.Name) to $resolvedAddress"

            if ($resolvedAddress -eq $server.IPAddress)
            {
                Write-Verbose "$($server.IPAddress) matches found address of $resolvedAddress"
                $server.namematch = $true
            }
            else
            {
                Write-Verbose "$($server.IPAddress) does not equal found address of $resolvedAddress"
                $server.namematch = $false
            }
        }
    }

    $serverList | Export-Csv -Path $Path -NoTypeInformation -Force

}

Então, se você quiser produzir um relatório mais tarde, poderá fazer algo como:

$problemServers = Import-Csv -Path c:\example.csv | ? NameMatch -eq $false

Exemplo.csv:

Name,IPAddress,NameMatch
server1,10.0.0.1,"True"
server2,10.0.0.2,
server3,10.0.0.3,"False"

Quando você executa o script pela primeira vez, a coluna NameMatch pode estar vazia (como é com o server2) e o script a preencherá.

    
por 27.06.2017 / 23:11