2016-12-14 4 views
0

Я запускаю ниже на файловом сервере 2008 R2 для извлечения информации о квотах, поскольку модуль PS FSRM недоступен. При сопоставлении строк в переменной $RegEx она работает нормально, пока в переменной всего 2 строки, а значения $matches[1] и $matches[2] добавляются как ожидалось в массив объектов, но когда я пытаюсь добавить третий захват или в этот случай 5 захватывает, я вообще ничего не получаю. Ничего в городе $matches и ничего не найдено в $objArr.Соответствие и захват нескольких операторов RegEx

$RegEx = 'Quota Path:\s+(.*)[\s\S]*?' + 
     'Source Template:\s+(.*)\s+' + 
     'Limit:\s+(.*)\s+' + 
     'Used:\s+(.*)\s+' + 
     'Available:\s+(.*)' 
$objArr = @() 

$objArr = (dirquota qu l | Out-String) -replace '\r\n', "`n" -split '\n\n' | 
      where {$_ -match $RegEx} | 
      foreach { 
      New-Object -TypeName psobject -Property ([ordered]@{ 
       QuotaPath = $matches[1] 
       Template = $matches[2] 
       QuotaLimit = $matches[3] 
       Used  = $matches[4] 
       Availble = $matches[5] 
      }) 
      } 

То, что я не понимаю, я могу переставить снимки и любую комбинацию из 2 будет работать, так что кажется, что строки захвата правильно до некоторой степени, но как только я пытаюсь добавить 3-ий или больше, я ничего не получаю. Я уверен, что я что-то упустил, так как форматируются строки захвата RegEx.

dirquota qu l | Out-String выводит строку следующим образом:

... 

Quota Path:    E:\DirA\SubdirA\SubdirA1 
Share Path:    \\SERVER\SubdirA\SubdirA1 
         \\SERVER\E\DirA\SubdirA\SubdirA1 
         \\SERVER\DirA\SubdirA\SubdirA1 
Source Template:  TemplateA (Matches template) 
Quota Status:   Enabled 
Limit:     500.00 MB (Hard) 
Used:     6.00 KB (0%) 
Available:    499.99 MB 
Peak Usage:    6.00 KB (4/1/2015 12:27 PM) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Quota Path:    E:\DirB\SubdirB\SubdirB1 
Share Path:    \\SERVER\SubdirB\SubdirB1 
         \\SERVER\E\DirB\SubdirB\SubdirB1 
         \\SERVER\DirB\SubdirB\SubdirB1 
Source Template:  TemplateB (Matches template) 
Quota Status:   Enabled 
Limit:     500.00 MB (Hard) 
Used:     1.00 KB (0%) 
Available:    500.00 MB 
Peak Usage:    1.00 KB (7/12/2016 12:09 PM) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

...

ответ

0

Вы не получаете желаемые результаты, поскольку регулярное выражение просто не соответствует. Там есть дополнительная линия между записью SourceTemplate и Limit, что ваш модифицирована регулярное выражение не учитывает:

... 
Quota Path:    E:\DirA\SubdirA\SubdirA1 
Share Path:    \\SERVER\SubdirA\SubdirA1 
         \\SERVER\E\DirA\SubdirA\SubdirA1 
         \\SERVER\DirA\SubdirA\SubdirA1 
Source Template:  TemplateA (Matches template) 
Quota Status: Enabled 
Limit:     500.00 MB (Hard) 
Used:     6.00 KB (0%) 
Available:    499.99 MB 
...

Source Template:\s+(.*)\s+ часть регулярного выражения совпадает с (суб) строка «Источник шаблона:» следуют один или больше символов пробелов (\s+), сгруппированное совпадение всех символов до (но не включая) следующей строки новой строки ((.*)) и снова один или несколько пробельных символов (\s+). Однако, поскольку следующая часть вашего регулярного выражения равна Limit:\s+(.*)\s+, вы получите только совпадение, если строка после Source Template: начинается с Limit:.

В принципе, модель Source Template:\s+(.*)\s+ соответствует только это:

... 
         \\SERVER\DirA\SubdirA\SubdirA1 
Source Template: TemplateA (Matches template) Quota Status:   Enabled 
Limit:     500.00 MB (Hard) 
...

, когда вы на самом деле нужно, чтобы соответствовать этому:

... 
         \\SERVER\DirA\SubdirA\SubdirA1 
Source Template: TemplateA (Matches template) Quota Status: Enabled Limit:     500.00 MB (Hard) 
...

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

'Source Template:\s+(.*)\s+' 

'Source Template:\s+(.*)[\s\S]+?' 

Класс символов [\s\S] соответствует любому символу, а не только пробельные символы (\s) и модификатор +? делает нежадным матч одного или нескольких символов. Таким образом, выражение включает весь текст до следующего вхождения строки Limit:.

+0

Теперь это имеет смысл. Я думал, что '. *' Будет соответствовать всем символам до следующей строки, но из того, что я вижу, перестает соответствовать в новой строке? –

+0

'.' соответствует любому символу *, кроме строк новой строки *,' * 'изменяет предыдущее выражение для соответствия нулю или более раз. –

0
  • Я недавно прочитал в ответ, что справедливость $ соответствует коллекции над границами труб не гарантируется.
  • Therefor я извлекал где,
  • получить данные из файла
  • Новый второй RegEx используется для разделения файла на куски, начиная с (и включая) Quota Path)
  • Я сломалась RegEx в RegEx101.com см. Ссылку.
  • и использование имени группа захвата, чтобы лучше отслеживать
  • образовавшегося $ objArr передаются по конвейеру Out-GridView

# https://www.regex101.com/r/3WrfYk/1 
$File = ".\quota.txt" 
# dirquota qu l | Set-Content $File 
$Delimiter = 'Quota Path:' 
$Escaped = [regex]::Escape($Delimiter) 
$Split  = "(?!^)(?=$Escaped)" 
$RegEx = '(?smi)^Quota Path:\s+(?<QuotaPath>.*?)$.*?' ` 
     + '^Source Template:\s+(?<Template>.*?)$.*?' ` 
     + '^Limit:\s+(?<QuotaLimit>.*?)' ` 
     + 'Used:\s+(?<Used>.*?)$.' ` 
     + 'Available:\s+(?<Available>.*?)$.' 
$objArr = @() 
$objArr = ((Get-Content $File -Raw) -split $Split)| 
    foreach { 
    if ($_ -match $RegEx) { 
     New-Object -TypeName psobject -Property (
     [ordered]@{ QuotaPath = $matches.QuotaPath 
        Template = $matches.Template 
        QuotaLimit = $matches.QuotaLimit 
        Used  = $matches.Used  
        Availble = $matches.Availble 
       }) 
    } # if 
} # foreach 
$objArr|select QuotaPath,Template,QuotaLimit,Used,Available|out-gridview 
+0

Проблема с регулярным выражением OP, а не с '$ match'. Кроме того, он использует Server 2008 R2, который поставляется с PowerShell v2. Если он не обновится до версии PowerShell v3 или более поздней версии «Get-Content -Raw», он не будет работать для него. –

+0

@AnsgarWiechers Я обновил все наши серверы 2008 R2 до PS 4.0. –

+0

@AnsgarWiechers С тех пор, как я тренировался с RegEx, я очень хорошо знаю, что это испортилось: вот почему я упомянул RegEx101.com, что очень полезно, когда RE сбой в какой-то момент с «катастрофическим обратным следом». – LotPings