【问题标题】:Converting txt file as HTML in Powershell Send-MailMessage在 Powershell Send-MailMessage 中将 txt 文件转换为 HTML
【发布时间】:2016-09-13 08:26:13
【问题描述】:

我从批处理过程中创建了以下格式的日志文件。

步骤日期时间说明

#0 09/12/2016 17:02:20 TestTableCount.ps1 从步骤 1 开始
#1 09/12/2016 17:02:21 表 etl.ProcessLog 为空。失败

我想在 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>'

但这会导致以下格式:

我希望状态和时间出现在 DateTime 列下,但从我编写的代码中,我得到了描述下的时间。

如何纠正这个问题并获得正确的格式?

【问题讨论】:

  • 既然您正在生成此日志文件,为什么不将其生成为 .csv 并免费获得您正在做的大部分事情呢?然后您也可以为您的表格使用一种样式,而不是将其嵌入到复杂的替换中。

标签: html powershell


【解决方案1】:

PowerShell 可以更好地处理对象,因此我将提出一些建议,而不是从字符串和正则表达式构建 html 文件。

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

# 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:

列有问题,但这不是简单的Select-Object 无法解决的问题。

【讨论】:

    【解决方案2】:

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

    改变

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

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

    并且替换应该符合您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2020-06-11
      • 2020-01-30
      • 2021-12-11
      相关资源
      最近更新 更多