我有一个文本文件,它是来自一系列Oracle SQL脚本的输出日志,这些脚本作为数据库部署的一部分运行。 我想将其转换为HTML,以便我在正则表达式中定义的任何错误/警告都可以突出,因为这个日志的大小是几MB。
这一切都在Windows上运行,所以我想我会尝试Powershell这样做,所以我也学到了一些东西。我正在使用Powershell 2.0版本。
到目前为止,我有以下代码:
($ifile=input file, $ofile=output file)
param($ifile, $ofile)
Set-Content $ofile `<html`>
Add-Content $ofile `<body`>
(Get-Content $ifile) |
Foreach-Object {$_ -replace "&","&" `
-replace ">", ">" `
-replace "<", "<" `
-replace '\b(?!(ORA-20+|ORA-01430|ORA-00955|ORA-02260|ORA-01442|ORA-01418|ORA-01408|ORA-31003)(?=\d|\b))^ORA-[0-9]+\d?\b(.*)' , '<font color=red><b>ORAERROR-$_</b></font>' `
-replace '((?i)PLS-+|SP2-+)(.*)', '<font color=red><b>ORAERROR-$_</b></font>' `
-replace '((?i)ORA-20+|ORA-01430|ORA-00955|ORA-02260|ORA-01442|ORA-01418|ORA-01408|ORA-31003)(.*)','<font color=orange><b>ORAWARNING-$_</b></font>'} |
foreach-object {$_ + "<br>"} |
Add-Content $ofile
Add-Content $ofile `<`/body`>
Add-Content $ofile `<`/html`>
现在我想扩展它以做更多,看起来更好而且我被困......
这是我想要做的:
通过这样做,我希望最终得到一个如下所示的输出文件:
HEADER
---------------------------------
Link to error $countnumber
Link to error $countnumber
Link to error $countnumber
..
..
..
Link to error $countnumber N
----------------------------------------
The whole of the log file including tags
..
..
..
EOF
我特别坚持尝试将-replace位放入临时文件,但随后也执行&lt; a href ...&gt;同时位到输出文件。我接近它的方式甚至可能不可能!!
非常感谢任何帮助。
如果我偏离了我对Powershell的逻辑和理解,请你能指出我的大方向,我会去做更多的阅读.....很多阅读。
干杯 尼克
答案 0 :(得分:0)
这里有几件事要做。
一个重要提示:这将仅在PowerShell 2.0版上运行。这不适用于PowerShell 3.0+版本,因为3.0+脚本块无法访问其范围之外的变量。请参阅:Undocumented changes to Powershell Scope handling v2/v3?
但是,由于您使用的是PowerShell 2.0,因此可以尝试以下代码:
#Note this will only work in PowerShell V 2.0 see: https://stackoverflow.com/questions/18515186/undocumented-changes-to-powershell-scope-handling-v2-v3/
($ifile=input file, $ofile=output file)
param($ifile, $ofile)
Set-Content $ofile `<html`>
Add-Content $ofile `<body`>
#Define Global Variables
$Global:i = 0
#Header for the file
$Global:Header = ""
#Body for the file
$Body = ""
$ErrorMatchEval = [System.Text.RegularExpressions.MatchEvaluator] {
#Build the Header that points to the named ancor
$Header += "<a href=`"#$i`">$($args[0])</a><br>`n"
#Output back the replacement with named anchor, and red bold error message
Write-Output "<a name=`"$i`"></a><font color=red><b>ORAERROR-$($args[0])</b></font>"
#increment anchor count variable
$i ++;
}
$WarningMatchEval = [System.Text.RegularExpressions.MatchEvaluator] {
#Build the Header that points to the named ancor
$Header += "<a href=`"#$i`">$($args[0])</a><br>`n"
#Output back the replacement with named anchor, and orange bold warning message
Write-Output "<a name=`"$i`"></a><font color=orange><b>ORAWARNING-$($args[0])</b></font>"
#increment anchor count variable
$i ++;
}
(Get-Content $ifile) |
Foreach-Object {
#Replace all & < >
$_ -replace "&","&" `
-replace ">", ">" `
-replace "<", "<"
#Find errors
$_ = [regex]::Replace($_, '\b(?!(ORA-20+|ORA-01430|ORA-00955|ORA-02260|ORA-01442|ORA-01418|ORA-01408|ORA-31003)(?=\d|\b))^ORA-[0-9]+\d?\b(.*)', $ErrorMatchEval)
$_ = [regex]::Replace($_, '((?i)PLS-+|SP2-+)(.*)', $ErrorMatchEval)
#Find Warnings
$_ = [regex]::Replace($_, '((?i)ORA-20+|ORA-01430|ORA-00955|ORA-02260|ORA-01442|ORA-01418|ORA-01408|ORA-31003)(.*)', $WarningMatchEval)
#Put in line breaks, and append to body
$Body += $_ + "<br>`n"
}
#Add the header first
Add-Content $ofile $Header
#Add the rest of the body
Add-Content $ofile $Body
Add-Content $ofile `<`/body`>
Add-Content $ofile `<`/html`>