如何在Powershell中使用正则表达式选择“捕获”代码块?

时间:2019-06-14 20:48:15

标签: regex powershell parsing

我正在尝试分析许多目录中的许多powershell脚本,并且我想将所有Catch代码块拉到列表/变量中。

我正在尝试编写正则表达式以选择以下格式的任何块

    Catch 
        {
        write-Host "Function:",$MyInvocation.MyCommand,"Failed with exception:" "Error"
        write-Host "Exception: $_" "Error"
        throw "Exception: $_"
        }

    Catch{
        write-Host "Function:",$MyInvocation.MyCommand,"Failed with exception:" "Error"
        write-Host "Exception: $_" "Error"
        throw "Exception: $_" }
Catch {write-Host "Function:",$MyInvocation.MyCommand,"Failed with exception:" "Error"
        write-Host "Exception: $_" "Error"
        throw "Exception: $_"}

基本上在任何地方都有一个后跟{}的字符,忽略单词“ Catch”和括号之间以及括号之后的换行符,忽略大小写。

我也希望返回{}之间的全部内容,以便我可以对其进行其他检查。

我想出的最好的办法是:


\b(\w*Catch\w*)\b.*\w*{\w.*}

如果全部在一行上,则将匹配。

我将在powershell中执行此操作,因此将非常感谢.net或powershell类型的正则表达式。

谢谢。

2 个答案:

答案 0 :(得分:5)

不要使用正则表达式在PowerShell中解析PowerShell代码

改为使用PowerShell解析器!

foreach($file in Get-ChildItem *.ps1){
    $ScriptAST = [System.Management.Automation.Language.Parser]::ParseFile($file.FullName, [ref]$null, [ref]$null)

    $AllCatchBlocks = $ScriptAST.FindAll({param($Ast) $Ast -is [System.Management.Automation.Language.CatchClauseAst]}, $true)

    foreach($catch in $AllCatchBlocks){
        # The catch body that you're trying to capture
        $catch.Body.Extent.Text

        # The "Extent" property also holds metadata like the line number and caret index
        $catch.Body.Extent.StartLineNumber
    }
}

答案 1 :(得分:2)

我的猜测是您希望使用此表达式或类似以下内容来捕获catch

\s*\bCatch\b\s*({[\s\S]*?})

收集新行。

Demo

,如果不需要单词边界:

\s*Catch\s*({[\s\S]*?})