नीचे दी गई पॉवरशेल स्क्रिप्ट आंशिक रूप से डीएफएस प्रतिकृति से संबंधित इवेंट आईडी के विशिष्ट सेट को ईमेल के रूप में भेजने में काम कर रही है।

हालांकि, मैं करना चाहता था:

  1. इवेंट लॉग के परिणाम को HTML ईमेल बॉडी के रूप में प्रदर्शित करें, जो ठीक से प्रदर्शित नहीं हो रहा है।
  2. HTML बॉडी में इवेंट आईडी के विशिष्ट सेट मौजूद होने पर लाल रंग में हाइलाइट करें। लाल रंग में: २००४, २१०४, २१०६, २२१२, ४२१२, ५००२, ५०१४

यहाँ मेरा प्रयास है जो विफलता में समाप्त होता है:

            $mailArgs = @{
                SmtpServer  = 'mail.domain.com'
                From        = 'SystemAdmin@domain.com'
                To          = 'Manager@domain.com'
                Subject     = '{0} DFS report'
                Attachments = 'C:\DFSReports\DFS-Events_{0}.csv'
                BodyAsHtml  = $true
            }
            
$HTMLBeginning = @'
<!DOCTYPE html>
<html lang="en">
<head>
    <style>$HTMLBeginning = @'
<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        body {{
            font-family: Arial;
        }}
        table {{
            width: 100%;
            border-collapse: collapse;
            border: 1px solid;
        }}
        th {{
            background-color: green;
            border: 1px solid;
            padding: 1px;
        }}
        td {{
            border: 1px solid;
            padding: 1px;
        }}
        .red_events {{
            color: red;
        }}
    </style>
    <title>DFS Replication Related Events since {0} hours ago</title>
</head>
<body>
    <table>
        <tr>
            <th>Time</th>
            <th>Event ID</th>
            <th>Message</th>
        </tr>
    <title>DFS Replication Related Events since {0} hours ago</title>
</head>
<body>
    <table>
        <tr>
            <th>Time</th>
            <th>Event ID</th>
            <th>Message</th>
        </tr>
'@

$HTMLEnd = @'
    </table>
</body>
</html>
'@

$HTMLBody = New-Object System.Collections.Generic.List[string]
$HTMLBody.Add($HTMLBeginning)

$EventIDs = 1006, 1008, 2004, 2104, 2212, 4202, 4206, 4208, 4212, 4304, 5002, 5012, 5014
$RedEvents = 2004, 2104, 2106, 2212, 4212, 5002, 5014
$Ago = -24

Get-DfsrMember | Select-Object -ExpandProperty ComputerName -Unique | Sort-Object | ForEach-Object {
    Write-Host "Processing $($_) ..."
    Try {
        $splat = $mailArgs.psobject.Copy()
        $splat['Attachments'] = $splat['Attachments'] -f $_
        $EventResults = Get-WinEvent -ComputerName $_ -FilterHashTable @{ LogName = 'DFS Replication'; StartTime = (Get-Date).AddHours($Ago); ID = $EventIDs } |
        Select-Object -Property TimeCreated, Id, Message |
        Sort-Object -Property TimeCreated 
        $EventResults | Export-Csv -NoTypeInformation -UseCulture -Path $splat['Attachments']
        $EventResults | foreach-Object {
            if ($_.ID -in $RedEvents) {
                $TableRow = @'
                <tr>
                    <td style="color:red;">{0}</td>
                    <td style="color:red;">{1}</td>
                    <td style="color:red;">{2}</td>
                    <td style="color:red;">{3}</td>
                </tr>
'@ -f $_.Time, $_.ID, $_.Message
            }
            else {
                $TableRow = @'
                <tr>
                    <td>{0}</td>
                    <td>{1}</td>
                    <td>{2}</td>
                </tr>
'@ -f $_.Time, $_.ID, $_.Message
            }
            $HTMLBody.Add($TableRow)
            Remove-variable -name TableRow
        }
        $HTMLBody.Add($HTMLEnd)
        $FinalBody = $HTMLBody -join '<br />' | Out-String
        $FinalBody = $FinalBody -f $Ago 
        $splat['Body'] = $FinalBody
    }
    Catch {
        Write-Host $splat['Attachments']
        Write-Error -ErrorRecord $_
        $splat['Body'] = "$($_) query failed:`r`n$($_.Exception.Message)"
        $splat.Remove('Attachments')
    }
    $splat['Subject'] = $splat['Subject'] -f $_
    Write-Host $splat['Attachments']
    Send-MailMessage @splat
}

कोड इस स्क्रीनशॉट की तरह है:https://i.imgur.com/y7OGQfS.png

त्रुटि है:

} : The given path's format is not supported.
    + CategoryInfo          : OpenError: (:) [Write-Error], NotSupportedException
    + FullyQualifiedErrorId : FileOpenFailure
0
Senior Systems Engineer 8 सितंबर 2020, 15:05

1 उत्तर

सबसे बढ़िया उत्तर

किसी और टिप्पणी के साथ एसओ को बाढ़ न करने के लिए, मैं यही कोशिश करूंगा।

हम पहले ही कोड में कुछ समस्याओं से निपट चुके हैं:

  • यदि आप किसी सूची वस्तु में HTML बनाना चाहते हैं, तो या तो इसे New-Object System.Collections.Generic.List[string] से प्रारंभ करें या (तेज़) [System.Collections.Generic.List[string]]::new() के साथ

    हो गया

  • यहां-स्ट्रिंग्स को टेम्प्लेट के रूप में उपयोग करना एक अच्छा विचार है। ध्यान रखें कि समापन '@ से पहले कोड में कोई भी सफेद जगह नहीं होनी चाहिए।

    हो गया

  • स्ट्रिंग में प्लेसहोल्डर्स को बदलने के लिए -f फ़ॉर्मेट ऑपरेटर का उपयोग करने पर अतिरिक्त ध्यान देने की आवश्यकता होती है, जब इस स्ट्रिंग में घुंघराले ब्रैकेट भी होते हैं, प्लेसहोल्डर से इसका कोई लेना-देना नहीं होता है। यदि आप प्लेसहोल्डर {0} के लिए सिवाय स्ट्रिंग में सभी { और } वर्णों को दोगुना कर देते हैं, तो आप यह काम कर सकते हैं।

    हो गया

  • सीएसएस वर्ग नामों के साथ उपयोग किए जाने पर प्रत्येक ईमेल क्लाइंट फ़ॉन्ट रंग प्रदर्शित करने में सक्षम नहीं है। यह सुनिश्चित करने के लिए कि टेक्स्ट लाल रंग में प्रदर्शित हो, शैली इनलाइन जोड़ें, इसलिए <td class="red_event">{0}</td> के बजाय <td style="color:red;">{0}</td>

    हो गया

फिर भी आपको जो त्रुटि मिल रही है उसका क्या कारण है?

मैंने आपके कोड को फिर से लिखा और ऐसा करते समय, मैंने पाया कि $HTMLBeginning यहां-स्ट्रिंग गलत थी। (दोगुनी पंक्तियाँ जैसे <!DOCTYPE html>)।
मैं इसका पूरा परीक्षण नहीं कर सकता, लेकिन कृपया मुझे बताएं कि क्या नीचे दिया गया कोड वह करता है जो आप करना चाहते हैं।

$attachmentPath = 'C:\DFSReports'

# if the path does not yet exist, create it
if (!(Test-Path -Path $attachmentPath)) {
    $null = New-Item -Path $attachmentPath -ItemType Directory
}

# set up a Hashtable for splatting to Send-MailMessage
$mailArgs = @{
    SmtpServer  = 'mail.domain.com'
    From        = 'SystemAdmin@domain.com'
    To          = 'Manager@domain.com'
    Subject     = '{0} DFS report'
    Attachments = Join-Path -Path $attachmentPath -ChildPath 'DFS-Events_{0}.csv'
    BodyAsHtml  = $true
}

# template Here-Strings to build the HTML body       
$HTMLBeginning = @'
<!DOCTYPE html>
<html lang="en">
<head>
    <title>DFS Replication Related Events since ##HOURSAGO## hours ago</title>
    <style>
        body {
            font-family: Arial;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            border: 1px solid;
        }
        th {
            background-color: green;
            border: 1px solid;
            padding: 1px;
        }
        td {
            border: 1px solid;
            padding: 1px;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <th>Time</th>
            <th>Event ID</th>
            <th>Message</th>
        </tr>
'@

$HTMLEnd = @'
    </table>
</body>
</html>
'@

$TableRow = @'
                <tr>
                    <td{0}>{1}</td>
                    <td{0}>{2}</td>
                    <td{0}>{3}</td>
                </tr>
'@

# initialize a List object for strings
$HTMLBody = [System.Collections.Generic.List[string]]::new()
$EventIDs  = 1006, 1008, 2004, 2104, 2212, 4202, 4206, 4208, 4212, 4304, 5002, 5012, 5014
$RedEvents = 2004, 2104, 2106, 2212, 4212, 5002, 5014
$Ago = -24
$EventFilter = @{ LogName = 'DFS Replication'; StartTime = (Get-Date).AddHours($Ago); ID = $EventIDs }

Get-DfsrMember | Select-Object -ExpandProperty ComputerName -Unique | Sort-Object | ForEach-Object {
    # capture the computername in case we enter the catch block
    $computer = $_
    Write-Host "Processing $computer ..."
    # fill in details for the email parameters
    $splat = $mailArgs.psobject.Copy()
    $splat['Attachments'] = $splat['Attachments'] -f $computer
    $splat['Subject']     = $splat['Subject'] -f $computer

    # empty the List and start building the html for the next computer
    $HTMLBody.Clear()
    $HTMLBody.Add(($HTMLBeginning -replace '##HOURSAGO##', $Ago))

    Try {
        $EventResults = Get-WinEvent -ComputerName $_ -FilterHashTable $EventFilter |
                        Select-Object -Property TimeCreated, Id, Message |
                        Sort-Object -Property TimeCreated
        Write-Host "Outputting attachment file $($splat['Attachments'])"
        $EventResults | Export-Csv -Path $($splat['Attachments']) -UseCulture -NoTypeInformation
        $EventResults | ForEach-Object {
            $color = if ($_.Id -in $RedEvents) { ' style="color:red;"' } else { '' }
            $row   = $TableRow -f $color, $_.TimeCreated, $_.Id, $_.Message
            $HTMLBody.Add($row)
        }
        $HTMLBody.Add($HTMLEnd)
        # join the array parts of the HTMLBody with NewLines and set that as the Body parameter
        # P.S. I was wrong earlier, this needs "`r`n", not '<br />'
        $splat['Body'] = $HTMLBody.ToArray() -join "`r`n"
    }
    Catch {
        Write-Host $splat['Attachments']
        Write-Error $_.Exception.Message
        $splat['Body'] = "$computer query failed:<br />$($_.Exception.Message)"
        $splat.Remove('Attachments')
    }
    Write-Host $splat['Attachments']
    Send-MailMessage @splat
}
1
Theo 9 सितंबर 2020, 16:03