Как выбрать «поймать» блоки кода с помощью регулярных выражений в powershell? - PullRequest
3 голосов
/ 14 июня 2019

Я пытаюсь проанализировать множество сценариев 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 ]

5 голосов
/ 14 июня 2019

Не используйте регулярные выражения для анализа кода 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
    }
}
2 голосов
/ 14 июня 2019

Я предполагаю, что вы хотите захватить catch с помощью этого выражения или чего-то подобного:

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

, который собирает новые строки.

Демонстрация

и, если граница слова не требуется:

\s*Catch\s*({[\s\S]*?})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...