1

Я создаю сценарий для получения IP-адресов от CSV, а затем пытаюсь пинговать / подключаться к ним. В конце концов я выполню несколько команд против них и выведу все это как дополнительные данные в CSV. Прямо сейчас я работаю с 2 разными CSV (вход и выход), пока не выясню процесс добавления.

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

По какой-то странной причине скрипт выводит IP-адрес в виде @{IPAddress=172.18.16.1} , или, если я закомментирую вывод по конвейеру из строки импорта, я получу следующее: @{IPAddress=172.18.16.2; Status=} . Пытаясь отладить это, я добавил Write-Host $ip в качестве первой строки в цикле foreach .

Я могу только догадываться, что я сталкиваюсь с какой-то проблемой объекта или строки, или я как-то вытягиваю дополнительное форматирование, но я не могу обойти это. Я хочу работать только с реальным IP-адресом, я не хочу, чтобы начальное и конечное форматирование @{}

Что я делаю неправильно? Как мне избавиться от лишнего форматирования?

3 ответа3

1

Вам просто нужно изменить $ip в определении $NewLine на $ip.IPAddress . $ip имеет тип PSCustomObject, где $ip.IPAddress имеет тип String.

Вы также не определили $CSVOutput и должны удалить второе определение $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
    }
}
0

Вот что я сделал, чтобы заставить это работать ограниченным образом, главное изменение - ваш цикл ForEach, который я использовал вместо этого: $ipaddresses.IPAddress | ForEach-Object .

Другое изменение находится в строке Write-Host для вывода Success/Failure: Write-Host $_ "Ping failed." -foreground red .

Также переменная $ NewLine: $NewLine = "{0},{1}" -f $_, "online" .

В конце концов, вот что у меня получилось. Я не смог полностью протестировать его, как вы сможете, но использование двух IP-адресов в моем фиктивном Addresses.csv, где один IP-адрес допустим, а другой нет, сработало так, как я думаю, вы ожидаете:

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

Способ PowerShell для создания нового файла CSV:

$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

Образец выхода на экран:

> .\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

Чтобы 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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .