Преобразование файлов HTML в CSV - PullRequest
0 голосов
/ 31 мая 2018

У меня есть приведенный ниже скрипт PowerShell, который показывает проверку работоспособности удаленных серверов CPU / Disk / Memory.

Он не выдает выходные данные в формате HTML, и я отправляю его на свой электронный идентификатор с опцией SMTP.Все работает нормально.

Текущий вывод: enter image description here

Наряду с выводом HTML я хочу, чтобы этот вывод также был сохранен в файле CSV, чтобыЯ могу загрузить его в Teradata, используя MLOAD.

  1. Пожалуйста, помогите мне получить выходные данные в CSV-файле.
  2. Как мы можем загрузить данные из CSV-файла в Teradata, может ли это бытьсделано с использованием powershell или пакета?

Код:

<code>$ServerListFile = "C:\Users\HOSDUM01\Desktop\Auto\Server_health_check\list.txt"  
$ServerList = Get-Content $ServerListFile -ErrorAction SilentlyContinue 
$Result = @() 
ForEach ($computername in $ServerList) {
    $AVGProc = Get-WmiObject -computername $computername win32_processor | 
        Measure-Object -property LoadPercentage -Average | Select Average
    $OS = gwmi -Class win32_operatingsystem -computername $computername |
        Select-Object @{Name = "MemoryUsage"; Expression = {“{0:N2}” -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory) * 100) / $_.TotalVisibleMemorySize) }}
    $vol = Get-WmiObject -Class win32_Volume -ComputerName $computername -Filter "DriveLetter = 'C:'" |
        Select-object @{Name = "C PercentFree"; Expression = {“{0:N2}” -f (($_.FreeSpace / $_.Capacity) * 100) } }
    $vol2 = Get-WmiObject -Class win32_Volume -ComputerName $computername -Filter "DriveLetter = 'E:'" |
        Select-object @{Name = "E PercentFree"; Expression = {“{0:N2}” -f (($_.FreeSpace / $_.Capacity) * 100) } }
    $vol3 = Get-WmiObject -Class win32_Volume -ComputerName $computername -Filter "DriveLetter = 'F:'" |
        Select-object @{Name = "F PercentFree"; Expression = {“{0:N2}” -f (($_.FreeSpace / $_.Capacity) * 100) } }

    $result += [PSCustomObject] @{ 
        ServerName = "$computername"
        CPULoad    = "$($AVGProc.Average)%"
        MemLoad    = "$($OS.MemoryUsage)%"
        CDrive     = "$($vol.'C PercentFree')%"
        EDrive     = "$($vol2.'E PercentFree')%"
        FDrive     = "$($vol3.'F PercentFree')%"
    }

    $Outputreport = "<HTML><TITLE> Server Health Report </TITLE>
                    <BODY background-color:peachpuff>
                    <font color =""#99000"" face=""Microsoft Tai le"">
                    <H2> Server Health Report </H2></font>
                    <Table border=1 cellpadding=0 cellspacing=0>
                    <TR bgcolor=Cyan align=center>
                    <TD><B>EP_Server_Name</B></TD>
                    <TD><B>CPU_Utilizied</B></TD>
                    <TD><B>Memory_Utilized</B></TD>
                    <TD><B>C_Drive_Free_Percentage</B></TD>
                    <TD><B>E_Drive_Free_Percentage</B></TD>
                    <TD><B>F_Drive_Free_Percentage</B></TD></TR>"

    Foreach ($Entry in $Result) { 
        if (($Entry.CpuLoad) -ge "80" -or ($Entry.memload) -ge "80" -or ($Entry.Cdrive) -le "20" -or ($Entry.Edrive) -le "20" -or ($Entry.Fdrive) -le "20") { 
            $Outputreport += "<TR bgcolor=red>" 
        } 
        else {
            $Outputreport += "<TR bgcolor=green>" 
        }
        $Outputreport += "<TD>$($Entry.Servername)</TD><TD align=center>$($Entry.CPULoad)</TD><TD align=center>$($Entry.MemLoad)</TD><TD align=center>$($Entry.Cdrive)</TD><TD align=center>$($Entry.Edrive)</TD><TD align=center>$($Entry.Fdrive)</TD></TR>" 
    }
    $Outputreport += "</Table></BODY></HTML>" 
} 

$Outputreport | out-file C:\Users\HOSDUM01\Desktop\Auto\Server_health_check\Test.htm 
#Invoke-Expression C:\Users\HOSDUM01\Desktop\Auto\Server_health_check\Test.htm
##Send email functionality from below line, use it if you want   
$smtpServer = "Random"
$smtpFrom = "test@test.com"
$smtpTo = "test@test.com"
$messageSubject = "Servers Health report"
$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto
$message.Subject = $messageSubject
$message.IsBodyHTML = $true
$message.Body = "<head><pre>$style
"$ message.Body + = Get-Content C: \ Users \ HOSDUM01 \ Desktop \ Auto \ Server_health_check \ test.htm $ smtp = New-Object Net.Mail.SmtpClient ($ smtpServer) $ smtp.Send ($ message)

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Поскольку $result уже содержит информацию, которую вы хотите в CSV, она может быть просто передана в Export-Csv

Просто добавьте эту строку в конце вашего скрипта:

$result | Export-Csv -Path C:\folder\health_check.csv -NoTypeInformation

Не используется Teradata, но уже был вопрос об импорте CSV: Как загрузить данные из файла CSV в таблицу с помощью Teradata Studio

0 голосов
/ 31 мая 2018

Все, что вам нужно сделать, это добавить к вашему сценарию:

$Result | Export-Csv "C:\Users\HOSDUM01\Desktop\Auto\Server_health_check\Test.csv" -NoType

или любой другой путь, по которому вы хотите сохранить файл


РЕДАКТИРОВАТЬсценарий вне интереса.

  • Упрощенное использование пути
  • Вставлено function DriveFreePercent и удалены промежуточные (ненужные) переменные.
  • переместило создание html за пределыforeach

Пример CSV-файла

"ServerName","CPULoad","MemLoad","CDrive","EDrive","FDrive"
"HP-G1610","4","32,61","94,56","",""

enter image description here

<code>## Q:\Test\2018\05\31\SO_50617742.ps1
$BaseDir = "C:\Users\HOSDUM01\Desktop\Auto\Server_health_check\"
$ServerListFile = Join-Path $BaseDir "Server_list.txt"
$ReportHtm =      Join-Path $BaseDir "Server_Test.htm"
$ReportCsv =      Join-Path $BaseDir "Server_Test.csv"

function DriveFreePercent {
  param ([string]$ComputerName,
         [string]$DriveLetter)
    Get-WmiObject -Class win32_Volume -ComputerName $ComputerName -Filter "DriveLetter = '$($DriveLetter):'" |
        ForEach {"{0:N2}" -f  (($_.FreeSpace / $_.Capacity)*100) }
}

$ServerList = Get-Content $ServerListFile -ErrorAction SilentlyContinue
$Result = @()
ForEach($computername in $ServerList) {
    $Result += [PSCustomObject] @{
        ServerName = "$computername"
        CPULoad = ("{0}" -f (Get-WmiObject -ComputerName $computername win32_processor|Measure LoadPercentage -Average).Average)
        MemLoad = (gwmi -Class win32_operatingsystem -ComputerName $computername |
                   ForEach{"{0:N2}" -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/$_.TotalVisibleMemorySize)})
        CDrive  = (DriveFreePercent $ComputerName C)
        EDrive  = (DriveFreePercent $ComputerName E)
        FDrive  = (DriveFreePercent $ComputerName F)
    }
}

$Outputreport = "<HTML><TITLE> Server Health Report </TITLE>
                <BODY background-color:peachpuff>
                <font color =""#99000"" face=""Microsoft Tai le"">
                <H2> Server Health Report </H2></font>
                <Table border=1 cellpadding=0 cellspacing=0>
                <TR bgcolor=Cyan align=center>
                <TD><B>EP_Server_Name</B></TD>
                <TD><B>CPULOAD</B></TD>
                <TD><B>MemLoad</B></TD>
                <TD><B>C_Free</B></TD>
                <TD><B>E_Free</B></TD>
                <TD><B>F_Free</B></TD></TR>"

Foreach($Entry in $Result)  {
    if( ($Entry.CpuLoad) -ge "80" -or
        ($Entry.Memload) -ge "80" -or
        ($Entry.Cdrive)  -le "20" -or
        ($Entry.Edrive)  -le "20" -or
        ($Entry.Fdrive)  -le "20") {
        $Outputreport += "<TR bgcolor=red>"
    } else {
        $Outputreport += "<TR bgcolor=green>"
    }
    $Outputreport += "<TD>$($Entry.Servername)</TD>"
    $Outputreport += "<TD align=center>$($Entry.CPULoad)%</TD>"
    $Outputreport += "<TD align=center>$($Entry.MemLoad)%</TD>"
    $Outputreport += "<TD align=center>$($Entry.Cdrive)%</TD>"
    $Outputreport += "<TD align=center>$($Entry.Edrive)%</TD>"
    $Outputreport += "<TD align=center>$($Entry.Fdrive)%</TD></TR>"

    $Outputreport += "</Table></BODY></HTML>"
}

$Outputreport | Out-File $ReportHtm
$Result | Export-Csv $ReportCsv -NoTypeInformation
#Invoke-Expression $ReportHtm
#gc $ReportCsv

##Send email functionality from below line, use it if you want
$smtpServer = "Random"
$smtpFrom = "test@test.com"
$smtpTo = "test@test.com"
$messageSubject = "Servers Health report"
$message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto
$message.Subject = $messageSubject
$message.IsBodyHTML = $true
$message.Body = "<head><pre>$style
"$ message.Body + = $ Outputreport$ smtp = New-Object Net.Mail.SmtpClient ($ smtpServer) # $ smtp.Send ($ message)
0 голосов
/ 31 мая 2018
$result = @()

for ($i=1; $i -lt 5; $i++) {
    $result += [PSCustomObject] @{ 
            ServerName = "$i"
            CPULoad = "$($AVGProc.Average)%"
            MemLoad = "$($OS.MemoryUsage)%"
            CDrive = "$($vol.'C PercentFree')%"
            EDrive = "$($vol2.'E PercentFree')%"
            FDrive = "$($vol3.'F PercentFree')%"
        }
}

$result | ConvertTo-Csv
...