De onde vem o @ {} neste loop foreach?

1

Estou criando um script para obter endereços IP de um arquivo CSV e, em seguida, tentar efetuar ping / conectar-se a eles. Eventualmente vou executar alguns comandos contra eles e gerar todos eles como dados extras no CSV. No momento, estou trabalhando com dois CSVs (entrada e saída) diferentes até descobrir o processo de anexação.

#Create a CSV
$CSVOutput = "$PSScriptRoot\Addresses scanned $(Get-Date -format “MM-dd-yyyy HHmm ss”).csv"
Write-Host "Creating output file " $CSVOutput
New-Item $CSVOutput -type file
$NewLine = "{0},{1}" -f "IPAddress", "Status"
$NewLine | add-content -path $CSVOutput

$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddresses = import-csv $inputCSV | select-object "IPAddress" #$ColumnHeader

$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddresses = import-csv $inputCSV
foreach($ip in $ipaddresses) {
Write-Host $ip
    if (test-connection $ip.("IPAddress") -count 1 -quiet) {
        $NewLine = "{0},{1}" -f $ip, "online"
        $NewLine | add-content -path $CSVOutput
    } else {
         write-host $ip.("IPAddress") "Ping failed." -foreground red
         $NewLine = "{0},{1}" -f $ip, "offline"
         $NewLine | add-content -path $CSVOutput
    }
}

Por algum motivo estranho, o script está exibindo o endereço IP na forma de @{IPAddress=172.18.16.1} ou, se eu comentar a saída canalizada da linha de importação, recebo isto: @{IPAddress=172.18.16.2; Status=} . Ao tentar depurar isso, adicionei Write-Host $ip como a primeira linha no loop foreach .

Eu só posso adivinhar que estou correndo em algum tipo de objeto vs questão de string, ou estou puxando formatação adicional de alguma forma, mas eu não posso passar por isso. Eu só quero trabalhar com um endereço IP real, não quero a formatação inicial e final @{}

O que estou fazendo de errado? Como me livrar da formatação extra?

    
por YetAnotherRandomUser 27.07.2017 / 21:25

3 respostas

1

Você só precisa alterar $ip na sua definição $NewLine para $ip.IPAddress . $ip é do tipo PSCustomObject, em que $ip.IPAddress é do tipo String.

Você também não definiu $CSVOutput e deve remover a segunda definição de $ipaddresses .

$inputCSV = ".\ipadr.csv"
$CSVOutput = ".\out.csv"
$ipaddresses = import-csv $inputCSV | select-object

foreach($ip in $ipaddresses) {
    Write-Host $ip.IPAddress
    if (test-connection $ip.IPAddress -count 1 -quiet) {
        $NewLine = "{0},{1}" -f $ip.IPAddress, "online"
        $NewLine | add-content -path $CSVOutput
    } else {
         write-host $ip.IPAddress "Ping failed." -foreground red
         $NewLine = "{0},{1}" -f $ip.IPAddress, "offline"
         $NewLine | add-content -path $CSVOutput
    }
}
    
por 27.07.2017 / 22:34
0

Veja o que eu fiz para fazer isso funcionar de maneira limitada, a principal mudança é o seu loop ForEach, que usei em vez disso: $ipaddresses.IPAddress | ForEach-Object .

A outra alteração está na linha Write-Host para gerar Sucesso / Falha: Write-Host $_ "Ping failed." -foreground red .

Além disso, a variável $ NewLine: $NewLine = "{0},{1}" -f $_, "online" .

No final, aqui está o que eu trabalhei. Eu não fui capaz de testá-lo totalmente como você será capaz, mas usando 2 IP's no meu endereço Addresses.csv onde um IP é legit o outro não é, funcionou como eu acho que você está esperando:

$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddresses = Import-CSV $inputCSV
$ipaddresses.IPAddress | ForEach-Object {
    if (test-connection $_ -count 1 -quiet) {
        Write-Host $_ "Ping success." -foreground green
        $NewLine = "{0},{1}" -f $_, "online"
        $NewLine | add-content -path $CSVOutput
    } else {
         Write-Host $_ "Ping failed." -foreground red
         $NewLine = "{0},{1}" -f $_, "offline"
         $NewLine | add-content -path $CSVOutput
    }
}
    
por 27.07.2017 / 22:23
0

Uma maneira do PowerShell de criar um novo arquivo CSV seria:

$OutputCSV = "$PSScriptRoot\AddressesChecked.csv"
$InputCSV = "$PSScriptRoot\Addresses.csv"

$IpAddresses = Import-Csv $InputCSV

$IPStatus = ForEach($IP in $IpAddresses.IPAddress) {
    If (Test-Connection $IP -Count 1 -Quiet) {
        [PSCustomObject]@{IPAddress = $IP
                          Status    = "online"}
    } else {
        [PSCustomObject]@{IPAddress = $IP
                          Status    =  "offline"}
    }
}
$IPStatus | Export-Csv $OutputCSV -NoTypeInformation
$IPStatus

Sample Ouput to screen:

> .\SU_1235174.ps1

IPAddress     OnlineStatus
---------     ------------
192.168.1.1   online
192.168.1.60  offline
192.168.1.91  offline
192.168.1.92  offline

Para Csv fle:

> gc .\AddressesChecked.csv
"IPAddress","OnlineStatus"
"192.168.1.1","online"
"192.168.1.60 ","offline"
"192.168.1.91 ","offline"
"192.168.1.92 ","offline"
    
por 27.07.2017 / 22:51