powershell阅读&写入多个文件

时间:2014-01-03 17:53:39

标签: powershell

我有一个文本文件,它是来自一系列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 "&","&amp" `
        -replace ">", "&gt;" `
        -replace "<", "&lt;" `
        -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`>

现在我想扩展它以做更多,看起来更好而且我被困......

这是我想要做的:

  • 输出html&amp; body标签输出文件
  • 将标题输出到输出文件
  • 每行:
    • 将所有匹配的正则表达式替换为匹配文本行
    • 如果匹配,则输出(指向上面的id)到outputfile
    • 将行(匹配与否)输出到带有&lt; br&gt;的临时文件中在末尾 直到EOF
    • 将cat temp文件放到输出文件的末尾。

通过这样做,我希望最终得到一个如下所示的输出文件:

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的逻辑和理解,请你能指出我的大方向,我会去做更多的阅读.....很多阅读。

干杯 尼克

1 个答案:

答案 0 :(得分:0)

这里有几件事要做。

  • 拆分您的“替换”例程,以便您可以单独处理这些案例。
  • 您不想直接将这些替换输出到文件,而是将其输出到变量,以便您可以先处理整个文件以创建标题。将标题输出到文件,然后输出文本正文。
  • 要获取您的链接,您正在考虑使用命名锚点请参阅:Links Within a Page
  • 要获取适当的命名锚点,您需要使用MatchEvaluator脚本块来:
    • 计算要使用的下一个命名锚点。
    • 创建标题条目
    • 创建要嵌入的命名锚点,并将其返回以插入替换语句。

一个重要提示:这将在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 "&","&amp" `
        -replace ">", "&gt;" `
        -replace "<", "&lt;"

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