Apache PowerShell—上次在过去24小时内启动Tomcat

Apache PowerShell—上次在过去24小时内启动Tomcat,apache,tomcat,powershell,event-log,Apache,Tomcat,Powershell,Event Log,这起作用了。。但是,它会给出以下错误消息: Get-WmiObject : Cannot validate argument on parameter 'ComputerName'. The argument is null or empty. Supply an argument that is not nul l or empty and then try the command again. At D:\WORK\ps\Tomcat1.ps1:116 char:67 + $

这起作用了。。但是,它会给出以下错误消息:

Get-WmiObject : Cannot validate argument on parameter 'ComputerName'. The argument is null or empty. Supply an argument that is not nul
l or empty and then try the command again.
At D:\WORK\ps\Tomcat1.ps1:116 char:67
+         $TomcatEvents=Get-WmiObject Win32_NTLogEvent -ComputerName <<<<  $servern -Filter "(Message like '%Tomcat%') AND (TimeWritten
 >= '$time')" |
    + CategoryInfo          : InvalidData: (:) [Get-WmiObject], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetWmiObjectCommand
代码如下:

$fileName= "D:\WORK\ps\Tomcat.htm"
$serverlist = "D:\WORK\ps\test_computers.txt"
# Lets create our variables
$time = [System.Management.ManagementDateTImeConverter]::ToDmtfDateTime((Get-Date).AddHours(-24))

New-Item -ItemType file $fileName-Force
# Function to write the HTML Header to the file

Function writeHtmlHeader
{
param($fileName)
$date = ( get-date ).ToString('MM/dd/yyyy')
Add-Content $fileName "<html>"
Add-Content $fileName "<head>"
Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $fileName '<title>Servers_Tomcat_Restarts</title>'
add-content $fileName '<STYLE TYPE="text/css">'
add-content $fileName  "<!--"
add-content $fileName  "td {"
add-content $fileName  "font-family: Tahoma;"
add-content $fileName  "font-size: 11px;"
add-content $fileName  "border-"
add-content $fileName  "border-right: 1px solid #999999;"
add-content $fileName  "border-bottom: 1px solid #999999;"
add-content $fileName  "border-"
add-content $fileName  "padding-"
add-content $fileName  "padding-right: 0px;"
add-content $fileName  "padding-bottom: 0px;"
add-content $fileName  "padding-"
add-content $fileName  "}"
add-content $fileName  "body {"
add-content $fileName  "margin-"
add-content $fileName  "margin-"
add-content $fileName  "margin-right: 0px;"
add-content $fileName  "margin-bottom: 10px;"
add-content $fileName  ""
add-content $fileName  "table {"
add-content $fileName  "border: thin solid #000000;"
add-content $fileName  "}"
add-content $fileName  "-->"
add-content $fileName  "</style>"
Add-Content $fileName "</head>"
Add-Content $fileName "<body>"
add-content $fileName  "<table width='100%' border='1'>"
add-content $fileName  "<tr bgcolor='#CCCCCC'>"
add-content $fileName  "<td colspan='8' height='25' align='center'>"
add-content $fileName  "<font face='tahoma' color='#003399' size='4'><strong>Tomcat Restart Report - $date</strong></font>"
add-content $fileName  "</td>"
add-content $fileName  "</tr>"
}

# Function to write the HTML Footer to the file
Function writeHtmlFooter
{
param($fileName)
Add-Content $fileName "</table>"
Add-Content $fileName "</body>"
Add-Content $fileName "</html>"
}

Function sendEmail
{param($htmlFileName)
$from=New-Object System.Net.Mail.MailAddress "user<usera@company.com>"
$to= New-Object System.Net.Mail.MailAddress "username@company.com"
$subject="Servers Tomcat Restarts Report - $Date" 
$smtphost="SMTP-SERVER"
$body = Get-Content $htmlFileName
$smtp= New-Object System.Net.Mail.SmtpClient $smtphost
$msg = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body
$msg.isBodyhtml = $true
$smtp.send($msg)
}


# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)
Add-Content $fileName "</table>"
}


# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)
Add-Content $fileName "<tr bgcolor=#CCCCCC>"
Add-Content $fileName "<td align='center'>Server Name</td>"
Add-Content $fileName "<td align='center'>Logfile</td>"
Add-Content $fileName "<td align='center'>Type</td>"
Add-Content $fileName "<td align='center'>User</td>"
<# Add-Content $fileName "<td align='center'>Regular Name</td>" #>
Add-Content $fileName "<td align='center'>TimeWritten (Central)</td>"
Add-Content $fileName "<td align='center'>SourceName</td>"
Add-Content $fileName "<td align='center'>Message</td>"
Add-Content $fileName "<td align='center'>EventCode</td>"
Add-Content $fileName "</tr>"
}
##########################################################################################################
### SCRIPT
remove-item $fileName
writeHtmlHeader $fileName
writeTableHeader $fileName
#writeTableFooter $fileName
#writeHtmlFooter $fileName

foreach ($computer in Get-Content $serverlist) {
    $servern=$computer.split(",")[0]
    $ip=$computer.split(",")[1]
    IF ( $Computer -notmatch 'DB' ) {
        # Lets get our stats
        # Lets create a re-usable WMI method for CPU stats

        $TomcatEvents=Get-WmiObject Win32_NTLogEvent -ComputerName $servern -Filter "(Message like '%Tomcat%') AND (TimeWritten >= '$time')" |
        select @{n="Server";e={$servern}},Logfile,Type,User,@{name='TimeWritten';Expression={$_.ConvertToDateTime($_.TimeWritten)}},SourceName,Message,EventCode | sort-object TimeWritten -desc
        foreach ($item in $TomcatEvents) {
            $Logfile = $item.Logfile
            $Type = $item.Type
            $UserName = $item.User
            $TimeWritten = $item.TimeWritten
            $SourceName = $item.SourceName
            $Message = $item.Message
            $Category = $item.Category
            $EventCode = $item.EventCode

            If ($EventCode -gt 0) {

                Add-Content $fileName "<tr>"
                Add-Content $fileName "<td align='center'> $servern ($ip) </td>"
                Add-Content $fileName "<td align='center'> $Logfile </td>"
                Add-Content $fileName "<td align='center'> $Type </td>"
                Add-Content $fileName "<td align='center'> $UserName </td>"
                Add-Content $fileName "<td align='center'> $TimeWritten </td>"
                Add-Content $fileName "<td align='center'> $SourceName </td>"
                Add-Content $fileName "<td align='center'> $Message </td>"
                Add-Content $fileName "<td align='center'> $EventCode </td>"
                Add-Content $fileName "</tr>"
                }
        }
    }
}
                writeHtmlFooter $fileName
                $date = ( get-date ).ToString('MM/dd/yyyy')
                #System 
                $file = Get-Content $fileName
                $containsWord = $file | %{$_ -match 'System'}
                If($containsWord -contains $true)
                {
                    sendEmail $fileName
                }

在test_computers.txt中

我有一个额外的空行或空行,这导致了错误

$fileName= "D:\WORK\ps\Tomcat.htm"
$serverlist = "D:\WORK\ps\test_computers.txt"
# Lets create our variables
$time = [System.Management.ManagementDateTImeConverter]::ToDmtfDateTime((Get-Date).AddHours(-24))

New-Item -ItemType file $fileName-Force
# Function to write the HTML Header to the file

Function writeHtmlHeader
{
param($fileName)
$date = ( get-date ).ToString('MM/dd/yyyy')
Add-Content $fileName "<html>"
Add-Content $fileName "<head>"
Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $fileName '<title>Servers_Tomcat_Restarts</title>'
add-content $fileName '<STYLE TYPE="text/css">'
add-content $fileName  "<!--"
add-content $fileName  "td {"
add-content $fileName  "font-family: Tahoma;"
add-content $fileName  "font-size: 11px;"
add-content $fileName  "border-"
add-content $fileName  "border-right: 1px solid #999999;"
add-content $fileName  "border-bottom: 1px solid #999999;"
add-content $fileName  "border-"
add-content $fileName  "padding-"
add-content $fileName  "padding-right: 0px;"
add-content $fileName  "padding-bottom: 0px;"
add-content $fileName  "padding-"
add-content $fileName  "}"
add-content $fileName  "body {"
add-content $fileName  "margin-"
add-content $fileName  "margin-"
add-content $fileName  "margin-right: 0px;"
add-content $fileName  "margin-bottom: 10px;"
add-content $fileName  ""
add-content $fileName  "table {"
add-content $fileName  "border: thin solid #000000;"
add-content $fileName  "}"
add-content $fileName  "-->"
add-content $fileName  "</style>"
Add-Content $fileName "</head>"
Add-Content $fileName "<body>"
add-content $fileName  "<table width='100%' border='1'>"
add-content $fileName  "<tr bgcolor='#CCCCCC'>"
add-content $fileName  "<td colspan='8' height='25' align='center'>"
add-content $fileName  "<font face='tahoma' color='#003399' size='4'><strong>Tomcat Restart Report - $date</strong></font>"
add-content $fileName  "</td>"
add-content $fileName  "</tr>"
}

# Function to write the HTML Footer to the file
Function writeHtmlFooter
{
param($fileName)
Add-Content $fileName "</table>"
Add-Content $fileName "</body>"
Add-Content $fileName "</html>"
}

Function sendEmail
{param($htmlFileName)
$from=New-Object System.Net.Mail.MailAddress "user<usera@company.com>"
$to= New-Object System.Net.Mail.MailAddress "username@company.com"
$subject="Servers Tomcat Restarts Report - $Date" 
$smtphost="SMTP-SERVER"
$body = Get-Content $htmlFileName
$smtp= New-Object System.Net.Mail.SmtpClient $smtphost
$msg = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body
$msg.isBodyhtml = $true
$smtp.send($msg)
}


# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)
Add-Content $fileName "</table>"
}


# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)
Add-Content $fileName "<tr bgcolor=#CCCCCC>"
Add-Content $fileName "<td align='center'>Server Name</td>"
Add-Content $fileName "<td align='center'>Logfile</td>"
Add-Content $fileName "<td align='center'>Type</td>"
Add-Content $fileName "<td align='center'>User</td>"
<# Add-Content $fileName "<td align='center'>Regular Name</td>" #>
Add-Content $fileName "<td align='center'>TimeWritten (Central)</td>"
Add-Content $fileName "<td align='center'>SourceName</td>"
Add-Content $fileName "<td align='center'>Message</td>"
Add-Content $fileName "<td align='center'>EventCode</td>"
Add-Content $fileName "</tr>"
}
##########################################################################################################
### SCRIPT
remove-item $fileName
writeHtmlHeader $fileName
writeTableHeader $fileName
#writeTableFooter $fileName
#writeHtmlFooter $fileName

foreach ($computer in Get-Content $serverlist) {
    $servern=$computer.split(",")[0]
    $ip=$computer.split(",")[1]
    IF ( $Computer -notmatch 'DB' ) {
        # Lets get our stats
        # Lets create a re-usable WMI method for CPU stats

        $TomcatEvents=Get-WmiObject Win32_NTLogEvent -ComputerName $servern -Filter "(Message like '%Tomcat%') AND (TimeWritten >= '$time')" |
        select @{n="Server";e={$servern}},Logfile,Type,User,@{name='TimeWritten';Expression={$_.ConvertToDateTime($_.TimeWritten)}},SourceName,Message,EventCode | sort-object TimeWritten -desc
        foreach ($item in $TomcatEvents) {
            $Logfile = $item.Logfile
            $Type = $item.Type
            $UserName = $item.User
            $TimeWritten = $item.TimeWritten
            $SourceName = $item.SourceName
            $Message = $item.Message
            $Category = $item.Category
            $EventCode = $item.EventCode

            If ($EventCode -gt 0) {

                Add-Content $fileName "<tr>"
                Add-Content $fileName "<td align='center'> $servern ($ip) </td>"
                Add-Content $fileName "<td align='center'> $Logfile </td>"
                Add-Content $fileName "<td align='center'> $Type </td>"
                Add-Content $fileName "<td align='center'> $UserName </td>"
                Add-Content $fileName "<td align='center'> $TimeWritten </td>"
                Add-Content $fileName "<td align='center'> $SourceName </td>"
                Add-Content $fileName "<td align='center'> $Message </td>"
                Add-Content $fileName "<td align='center'> $EventCode </td>"
                Add-Content $fileName "</tr>"
                }
        }
    }
}
                writeHtmlFooter $fileName
                $date = ( get-date ).ToString('MM/dd/yyyy')
                #System 
                $file = Get-Content $fileName
                $containsWord = $file | %{$_ -match 'System'}
                If($containsWord -contains $true)
                {
                    sendEmail $fileName
                }