2015-09-09 5 views
0

У меня есть код для pinging серверов несколько раз. Это лучше всего подходит для моего объекта. Но я хочу отобразить результат кода на HTML-странице. Как мне это сделать?Отображение вывода в html

Function Ping-Host { 
    #Parameter Definition 
    Param (
     [Parameter(position = 0)] $Hosts, 
     [Parameter] $ToCsv 
    ) 

    #Funtion to make space so that formatting looks good 
    Function Make-Space($l,$Maximum) { 
     $space ="" 
     $s = [int]($Maximum - $l) + 1 
     1..$s | %{$space+=" "} 

     return [String]$space 
    } 

    #Array Variable to store length of all hostnames 
    $LengthArray = @() 
    $Hosts | %{$LengthArray += $_.length} 

    #Find Maximum length of hostname to adjust column witdth accordingly 
    $Maximum = ($LengthArray | Measure-object -Maximum).maximum 
    $Count = $hosts.Count 

    #Initializing Array objects 
    $Success = New-Object int[] $Count 
    $Failure = New-Object int[] $Count 
    $Total = New-Object int[] $Count 
    cls 
    #Running a never ending loop 
    while ($true) { 
     $i = 0 #Index number of the host stored in the array 
     $out = "| HOST$(Make-Space 4 $Maximum)| STATUS | SUCCESS | FAILURE | ATTEMPTS |" 
     $Firstline="" 
     1..$out.length | %{$firstline+="_"} 

     #output the Header Row on the screen 
     Write-Host $Firstline 
     Write-host $out -ForegroundColor White -BackgroundColor Black 

     $Hosts | %{ 
      $total[$i]++ 
      if (Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue) { 
       $success[$i]+=1 
       #Percent calclated on basis of number of attempts made 
       $SuccessPercent = $("{0:N2}" -f (($success[$i]/$total[$i])*100)) 
       $FailurePercent = $("{0:N2}" -f (($Failure[$i]/$total[$i])*100)) 

       #Print status UP in GREEN if above condition is met 
       Write-Host "| $_$(Make-Space $_.Length $Maximum)| UP$(Make-Space 2 4) | $SuccessPercent`%$(Make-Space ([string]$SuccessPercent).length 6) | $FailurePercent`%$(Make-Space ([string]$FailurePercent).length 6) | $($Total[$i])$(Make-Space ([string]$Total[$i]).length 9)|" -BackgroundColor Green 
      } else { 
       $Failure[$i]+=1 

       #Percent calclated on basis of number of attempts made 
       $SuccessPercent = $("{0:N2}" -f (($success[$i]/$total[$i])*100)) 
       $FailurePercent = $("{0:N2}" -f (($Failure[$i]/$total[$i])*100)) 

       #Print status DOWN in RED if above condition is met 
       Write-Host "| $_$(Make-Space $_.Length $Maximum)| DOWN$(Make-Space 4 4) | $SuccessPercent`%$(Make-Space ([string]$SuccessPercent).length 6) | $FailurePercent`%$(Make-Space ([string]$FailurePercent).length 6) | $($Total[$i])$(Make-Space ([string]$Total[$i]).length 9)|" -BackgroundColor Red 
      } 
      $i++ 
     } 

     #Pause the loop for few seconds so that output 
     #stays on screen for a while and doesn't refreshes 

     Start-Sleep -Seconds 10 
     cls 
    } 
} 

Ping-Host '10.50.5.33' 
+0

ли вы _really_ хотите, чтобы ваш HTML смотреть экс actly like is в настоящее время на вашем выходе? Я имею в виду каждую попытку, показанную как отдельный ряд? – Matt

+0

Да, Мэтт. Я хочу точный вывод –

ответ

1

ConvertTo-HTML является простым ответом здесь, но сначала вы должны иметь выход на основе объекта. В настоящее время вы просто выводите текст на консоль с Write-Host. Чтобы сделать эту работу, вы делаете некоторые причудливые форматирующие ножки, которые, к сожалению, бесполезны, если вы просто собираетесь выводить на HTML.

Вы можете изменить это, если хотите, но мне не понравилась идея while($true), так как она нарушит естественное создание таблицы HTML. Очевидно, вы имеете право делать то, что хотите, но это должна быть рабочая версия, которая почти дублирует то, что у вас есть. Если вы хотите сделать некоторое форматирование, я рекомендую вам искать html-стили.

Function Ping-Hosts{ 
    param(
     [string[]]$hosts, 
     [int]$MaxPings=100 
    ) 

    # Hashtable that will record ongoing statistics 
    $results = $hosts | ForEach-Object{ 
     @{ 
      $_ = @{ 
       Successes = 0 
       Attempts = 0 
      } 
     } 
    } 

    1..$MaxPings | ForEach-Object{ 
     # Ping each computer a maximumn number of times. 
     $pingCount = $_ 
     $hosts | ForEach-Object{ 
      # Clear output statistics 
      $props = @{ 
       Host = $_ 
       Status = "Down" # Assume it's down. 
      } 

      # Perform a single ping 
      if (Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue){ 
       # Success 
       $results.$_.Successes = $results.$_.Successes + 1 
       $props.Status = "UP" 
      } 

      # Raise the number of attempts 
      $results.$_.Attempts = $results.$_.Attempts + 1 

      # Calculate statistics 
      If($results.$_.Successes -eq 0){ 
       $props.Success = "{0:p2}" -f 0 
      } else { 
       $props.Success = "{0:p2}" -f ($results.$_.Attempts/$results.$_.Successes) 
      } 

      If($results.$_.Attempts - $results.$_.Successes -eq 0){ 
       $props.Failure = "{0:p2}" -f 0 
      } else { 
       $props.Failure = "{0:p2}" -f ($results.$_.Attempts/($results.$_.Attempts - $results.$_.Successes)) 
      } 
      $props.Attempts = $results.$_.Attempts 

      # Output results. 
      New-Object -TypeName psobject -Property $props 
     } 
    } 
} 

исполнение Образец

Ping-Hosts "c4222","C4280" | ConvertTo-Html -Fragment 

Частичное Пример вывода

<tr><th>Host</th><th>Status</th><th>Attempts</th><th>Failure</th><th>Success</th></tr> 
<tr><td>c4222</td><td>UP</td><td>1</td><td>0.00 %</td><td>100.00 %</td></tr> 
<tr><td>C4280</td><td>UP</td><td>1</td><td>0.00 %</td><td>100.00 %</td></tr> 
<tr><td>c4222</td><td>UP</td><td>2</td><td>0.00 %</td><td>100.00 %</td></tr> 
<tr><td>C4280</td><td>UP</td><td>2</td><td>0.00 %</td><td>100.00 %</td></tr> 

Ближе к тому, что вы хотели

Если вы хотите чего-то другого, я бы посмотрел на css-форматирование ближе. Это не так, как я бы это сделал, но посмотрю. Вы усложнять, запрашивая дополнительные заголовки, как вы идете (может быть, есть лучший способ, но мы прочь достаточно темы для этого вопроса)

Function Ping-Hosts{ 
    param(
     [string[]]$hosts, 
     [int]$MaxPings=100 
    ) 

    # Hashtable that will record ongoing statistics 
    $results = $hosts | ForEach-Object{ 
     @{ 
      $_ = @{ 
       Successes = 0 
       Attempts = 0 
      } 
     } 
    } 

    1..$MaxPings | ForEach-Object{ 
     # Ping each computer a maximumn number of times. 
     $pingCount = $_ 
     $hosts | ForEach-Object{ 
      # Clear output statistics 
      $props = @{ 
       Host = $_ 
       Status = "Down" # Assume it's down. 
      } 

      # Perform a single ping 
      if (Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue){ 
       # Success 
       $results.$_.Successes = $results.$_.Successes + 1 
       $props.Status = "UP" 

       # Set the backround color 
       $colour = "#2FFF18" 

      } else { 
       # Set the backround color 
       $colour = "#FF2020" 
      } 

      # Raise the number of attempts 
      $results.$_.Attempts = $results.$_.Attempts + 1 
      $props.Attempts = $results.$_.Attempts 

      # Calculate statistics 
      If($results.$_.Successes -eq 0){ 
       $props.Success = "{0:p2}" -f 0 
      } else { 
       $props.Success = "{0:p2}" -f ($results.$_.Attempts/$results.$_.Successes) 
      } 

      If($results.$_.Attempts - $results.$_.Successes -eq 0){ 
       $props.Failure = "{0:p2}" -f 0 
      } else { 
       $props.Failure = "{0:p2}" -f ($results.$_.Attempts/($results.$_.Attempts - $results.$_.Successes)) 
      } 

      # Output results. 
      $frag = New-Object -TypeName psobject -Property $props | ConvertTo-Html -Fragment 
      $frag -replace "<tr><td>","<tr bgcolor=$colour><td>" 
     } 
    } 
} 

Примера вызов

Ping-Hosts "c4222","3" -MaxPings 2 | Set-Content c:\temp\test.html 

Sample Выход

enter image description here

+0

спасибо матовый за ответ. Это было хорошо. Но когда я пытаюсь выполнить ping, который отключен, я получаю эту ошибку. Попытка делить на ноль. В строке: 38 char: 13 + $ props.Success = "{0: p2}" -f ($ results. $ _. Попытки/$ results. $ _. Suc ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId: RuntimeException –

+0

@BasatiNaveen Я обновил эту учетную запись. Похоже, я не проводил достаточного тестирования. – Matt

+0

Спасибо Matt.but Я буду счастлив, если он отобразит вывод в html, как если бы он показывался в моем коде. Надеюсь, мы сможем получить этот результат. Извините, если я ошибаюсь –

0

Используйте командлет ConvertTo-Html. Вы можете нажимать на этот объект командлета по своему усмотрению.

$_$(Make-Space $_.Length $Maximum)| DOWN$(Make-Space 4 4) | $SuccessPercent`%$(Make-Space ([string]$SuccessPercent).length 6) | $FailurePercent`%$(Make-Space ([string]$FailurePercent).length 6) | $($Total[$i])$(Make-Space ([string]$Total[$i]).length 9)**| Convert-ToHtml | Set-Content c:\path\tofile.html** 

Это сделает таблицу, которая покажет вам в браузере все, что вам нужно. Конечно, вид по умолчанию не очень красиво форматирование - так что вы можете использовать что-то вроде этого: http://foxdeploy.com/2014/05/23/using-html-formatting-to-create-useful-webpage-reports-from-powershell/

+1

Вы действительно не используете это правильно. Вы говорите: «Вы можете подключиться к этим командам», но вы не используете объекты в своем примере. Я также вижу синтаксические ошибки в этом коде. – Matt

Смежные вопросы