我有以下格式从批处理创建的日志文件。
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>'
但这导致以下格式:
我希望状态和时间可以在DateTime列下,但是从我编写的代码中我得到的时间在描述之下。
如何更正并获得正确的格式?
答案 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:
这些列无序,但简单的Select-Object
无法修复。