2016-04-13 1 views
0

Мне было интересно, как я могу вернуть вывод Resolve-DnsName из своего сценария Test-Connection и добавить его в CSV, который я создал.Resolve-DnsName внутри Test-Connection

Мне нравится захватывать название, тип, TTL, раздел из этого, пожалуйста.

Только вызовите Resolve-DnsName, когда пинг не удался.

$servers = Get-Content "servers.txt" 
$collection = $() 
foreach ($server in $servers) 
{ 
    $status = @{ "ServerName" = $server; "TimeStamp" = (Get-Date -f s) } 
    $result = Test-Connection $server -Count 1 -ErrorAction SilentlyContinue 
    if ($result) 
    { 
     $status.Results = "Up" 
     $status.IP = ($result.IPV4Address).IPAddressToString 
    } 
    else 
    { 
     $status.Results = "Down" 
     $status.IP = "N/A" 
     $status.DNS = if (-not(Resolve-DnsName -Name $server -ErrorAction SilentlyContinue)) 
     { 
      Write-Output -Verbose "$server -- Not Resolving" 
     } 
     else 
     { 
      "$server resolving" 
     } 
    } 
    New-Object -TypeName PSObject -Property $status -OutVariable serverStatus 

    $collection += $serverStatus 
} 
$collection | Export-Csv -LiteralPath .\ServerStatus3.csv -NoTypeInformation 

но ничего нового не добавлено в CSV.

+2

Не предполагайте. Пытаться. Если это не удается: вернитесь и покажите, что вы пробовали, а также результаты, которые вы получили. –

+0

Если ничего не добавлено, я подозреваю, что имя действительно решит. Добавьте ветку 'else' в этот оператор, чтобы убедиться:' $ status.DNS = if (...) {...} else {"$ server resolving"} ' –

+0

Я пробовал, что ничего не выписано вообще , Любые другие предложения, пожалуйста? – Steve

ответ

1

Вы столкнулись с PowerShell. PowerShell определяет столбцы, отображаемые в выводе таблицы/CSV из первого обработанного объекта. Если этот объект не имеет свойства DNS, этот столбец не будет отображаться на выходе, даже если у него есть другие объекты в списке. Если другие объекты не имеют свойств, присутствующих в первом объекте, они будут отображаться как пустые значения.

Демонстрация:

PS C:\>$a = (New-Object -Type PSObject -Property @{'a'=1; 'b'=2}), 
>>(New-Object -Type PSObject -Property @{'a'=3; 'b'=4; 'c'=5}), 
>>(New-Object -Type PSObject -Property @{'b'=6; 'c'=7}) 
>> 
PS C:\>$a | Format-Table -AutoSize 

a b 
- - 
1 2 
3 4 
    6 

PS C:\>$a[1..2] | Format-Table -AutoSize 

c b a 
- - - 
5 4 3 
7 6

Если вы хотите, чтобы сгенерировать вывод табличного всегда создавать объекты равномерно с тем же набором свойств. Выбор разумных значений по умолчанию позволяет снизить общую кодовую базу.

$collection = foreach ($server in $servers) { 
    $status = New-Object -Type PSObject -Property @{ 
    'ServerName' = $server 
    'TimeStamp' = Get-Date -f s 
    'Results' = 'Down' 
    'IP'   = 'N/A' 
    'HasDNS'  = [bool](Resolve-DnsName -Name $server -EA SilentlyContinue) 
    } 

    $result = Test-Connection $server -Count 1 -EA SilentlyContinue 

    if ($result) { 
    $status.Results = 'Up' 
    $status.IP  = ($result.IPV4Address).IPAddressToString 
    } 

    $status 
} 
+0

Большое спасибо за это. Общий вопрос, если бы я хотел выполнить петлю через результат и получить, например, Type, TTL и раздел? Это как-то документировано, как их получить? – Steve