2016-12-14 129 views
0

由於PS FSRM模塊不可用,我在2008 R2文件服務器上運行以下命令來提取配額信息。當匹配$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的任意組合都可以工作,因此它似乎捕捉串是正確的在一定程度上,但只要我嘗試添加第三或更多,我什麼也得不到。我確定我錯過了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

你沒有得到預期的效果,因爲你的正則表達式簡單不匹配。還有的SourceTemplateLimit記錄你修改的正則表達式不佔之間的附加線:

... 
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
  • 我最近在復讀的$的有效性 收集匹配那些在管界沒有guarantied。
  • THEREFOR我除去其中,
  • 得到從文件中的數據
  • 新的第二正則表達式是用於將文件分割成開始 與(幷包括)塊Quota Path
  • 我打破了正則表達式中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的正則表達式,而不是'$ matches'。另外,他正在使用PowerShell v2附帶的Server 2008 R2。除非他升級到PowerShell v3或更高版本,否則「Get-Content -Raw」不適用於他。 –

+0

@AnsgarWiechers我已將所有2008 R2服務器升級到PS 4.0。 –

+0

@AnsgarWiechers由於我正在處理RegEx,所以我很清楚它已經搞亂了:這就是爲什麼我提到RegEx101.com,這很有幫助,看到RE在「catastophic backtracking」失敗。 – LotPings