在Powershell Send-MailMessage中将txt文件转换为HTML

时间:2016-09-12 21:13:31

标签: html powershell

我有以下格式从批处理创建的日志文件。

Step DateTime            Description

#0   09/12/2016 17:02:20 TestTableCount.ps1 started from step 1
#1   09/12/2016 17:02:21 The table etl.ProcessLog is Empty . Failed

我想在PowerShell中使用Send-MailMessage将其添加到电子邮件正文中。

我编写了一个代码,用于将文本文件转换为HTML,并将其作为表格添加到邮件正文中。

代码:

$body = Get-Content $LogFile | out-String

$body = $body -replace '^(\S+)\s+(\S+)\s+(\S+)', '<tr><th style = "border: 1px solid black; background: #dddddd; padding: 5px;">$1</th><th style = "border: 1px solid black; background: #dddddd; padding: 5px;">$2</th><th style = "border: 1px solid black; background: #dddddd; padding: 5px;">$3</th></tr>'
$body = $body -replace '\n(\S+)\s+(\S+)\s+(\S+)', '<tr><td style = "border: 1px solid black; padding: 5px;">$1</td><td style = "border: 1px solid black; padding: 5px;">$2</td><td style = "border: 1px solid black; padding: 5px;">$3</td></tr>'
$body = '<body><table style = "border: 1px solid black; border-collapse: collapse;">' + $body + '</table></body>'

但这导致以下格式:

This is the result from my code

我希望状态和时间可以在DateTime列下,但是从我编写的代码中我得到的时间在描述之下。

如何更正并获得正确的格式?

2 个答案:

答案 0 :(得分:0)

日期和时间用空格分隔,空格与第二个正则表达式中的第二个\s+匹配。

更改

$body = $body -replace '\n(\S+)\s+(\S+)\s+(\S+)', '<tr><td ...'

$body = $body -replace '\n(\S+)\s+(\S+ \S+)\s+(\S+)', '<tr><td ...'

并且替换应该按照您的期望进行。

答案 1 :(得分:0)

PowerShell可以更好地处理对象,所以我建议除了从字符串和正则表达式构建html文件之外的其他内容。

虽然我要呈现的代码看起来很乏味,但工作效率更高,并且可以轻松地为其他任务量身定制。此代码的第一部分来自my answer to another question about parsing fixed width data from a test file。第二个是简单展示ConvertTo-HTML的工作原理。前者需要利用后者。假设文件“C:\ temp \ Test.txt”是您的日志文件并根据需要进行替换。对于此代码段末​​尾的输出文件路径也是如此。

# Convert the fixed width left aligned file into a collection of psobjects
$data = Get-Content C:\temp\Test.txt | Where-Object{![string]::IsNullOrWhiteSpace($_)}

$headerString = $data[0]
$headerElements = $headerString -split "\s+" | Where-Object{$_}
$headerIndexes = $headerElements | ForEach-Object{$headerString.IndexOf($_)}

$results = $data | Select-Object -Skip 1  | ForEach-Object{
    $props = @{}
    $line = $_
    For($indexStep = 0; $indexStep -le $headerIndexes.Count - 1; $indexStep++){
        $value = $null            # Assume a null value 
        $valueLength = $headerIndexes[$indexStep + 1] - $headerIndexes[$indexStep]
        $valueStart = $headerIndexes[$indexStep]
        If(($valueLength -gt 0) -and (($valueStart + $valueLength) -lt $line.Length)){
            $value = ($line.Substring($valueStart,$valueLength)).Trim()
        } ElseIf ($valueStart -lt $line.Length){
            $value = ($line.Substring($valueStart)).Trim()
        }
        $props.($headerElements[$indexStep]) = $value    
    }
    [pscustomobject]$props
} 

# Build the html from the $result
$style = @"
<style>
    body{border: 1px solid black; border-collapse: collapse}
    th{border: 1px solid black; background: #dddddd; padding: 5px}
    td{border: 1px solid black; padding: 5px}
</style>
"@

$results | Select-Object $headerElements | ConvertTo-Html -Head $style | Set-Content c:\temp\test.html

请注意,我在上面的代码中转换了您的样式。生成的文件看起来像html:

rendered table

这些列无序,但简单的Select-Object无法修复。