Как оптимизировать производительность выражений Regex в Powershell - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь найти строку в тысячах файлов с разными шаблонами. Мой Regex работает нормально и возвращает то, что я хочу. Но проблема в производительности. Поиск всех файлов занимает более 8 часов (более 100 000 файлов). Можно ли как-нибудь оптимизировать это?

Моя цель - идентифицировать все sql объекты (с / без имени схемы) в любых файлах / проектах vb / c # / powershell.

Мое регулярное выражение и комбинации, которые я пытаюсь найти, находятся по ссылке ниже Regex

Я хочу идентифицировать строки в этом формате в любом файле

[dbo].xyz

dbo.[xyz]

[dbo].[xyz]

"dbo.xyz"

"[dbo].xyz"

"dbo.[xyz]"

"[dbo].[xyz]"

И ниже приведен мой фрагмент PowerShell

get-childitem -Path "$( $SearchPath )"  -Force -recurse | Where-Object { ($_.Extension -eq '.bas') -or ($_.Extension -eq '.cls') -or ($_.Extension -eq '.sql') -or ($_.Extension -eq '.cs')-or ($_.Extension -eq '.csproj')-or ($_.Extension -eq '.vb') -or ($_.Extension -eq '.cshtml') -or ($_.Extension -eq '.ps1') -or ($_.Extension -eq '.psm1')} `
                | Select-String -Pattern """(\[)?($( $SchemaName ))?(\])?(\.)?(\[)?[^a-zA-Z_\s\@\$\/,-]$( $ObjectName )(\])?[^a-zA-Z.//-]""?" `
                | select-string "^\s*$", "^\s*'", "^\s*#", "^\s*//", "^\s*/\*", "^\s*\*.*(?:\*/)?\s*$", 'Headers' -NotMatch `
                | Select Path, LineNumber

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 16 апреля 2020

Если я правильно понимаю вопрос, вы можете сделать это с гораздо более простым регулярным выражением.

Кроме того, вместо использования множества ($_.Extension -eq '.something') операторов Where-Object используйте -Include. Это позволит быстрее собрать нужные файлы:

$SearchPath = 'D:\Test'
$Includes   = '*.bas','*.cls','*.sql','*.cs','*.csproj','*.vb','*.cshtml','*.ps1','*.psm1'

Get-ChildItem -Path $SearchPath -Recurse -Include $Includes -File -Force |
    Select-String -Pattern '"?\[?\w+\]?\.\[?\w+\]?"?' |
    Select-Object Path, LineNumber

Результат примерно такой:

Path              LineNumber
----              ----------
D:\Test\Blah1.ps1          2
D:\Test\Blah2.sql          6
D:\Test\Blah3.bas          4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...