2016-12-14 102 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