2016-12-14 7 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의 조합을 다시 정렬 할 수 있습니다, 그래서 바로 내가 3을 추가하려고하거나 캡처 문자열이 어느 정도 정확 보이지만, 더, 나는 아무것도 얻지 않는다. 나는 RegEx 캡쳐 문자열이 포맷 된 방식으로 뭔가를 놓치고 있다고 확신한다. 다음과 같이 dirquota qu l | Out-String

문자열을 출력 : 나는 최근에 $의 유효성이 guarantied되지 파이프 경계에 걸쳐 수집과 일치하는지 대답을 읽어

... 

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

당신이 원하는 결과를 얻지 못하고있는 트랙에게이 $ objArr 아웃 - GRIDVIEW으로 파이프됩니다 결과적

  • 을 유지 일치하지 않습니다.

    ... 
    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+ 부분은 (하위) 문자열과 일치 : 대한 수정 된 정규 표현식을 고려하지 않는 SourceTemplateLimit 기록 사이에 추가 라인이있다 "소스 템플릿 :"하나 다음에 공백 문자 (\s+), 다음 줄 바꿈 문자 ((.*))까지의 모든 문자를 그룹화하여 일치시키고 하나 이상의 공백 문자 (\s+)를 다시 지정합니다. 그러나 정규 표현식의 다음 부분이 Limit:\s+(.*)\s+이므로 Source Template: 이후의 행이 Limit:으로 시작하는 경우에만 일치를 얻습니다.

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

    당신이 실제로 필요할 때이 일치하도록 :

    기본적으로, 패턴 Source Template:\s+(.*)\s+는이 일치

    ... 
             \\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 번 이상 수정합니다. –

    0
    • .
    • 그 때문에 나는 곳을 제거,
    • 이 파일에서 데이터를 얻을 수는
    • 새로운 두 번째 정규식과 시작 (포함) 청크로 파일을 분할하는 데 사용됩니다
    • Quota Path)
    • 나는에 정규식을 무너 뜨 RegEx101.com 링크를 참조하십시오.
    • 사용라는 이름의 캡처 그룹은 더 간단하게 정규 표현식 때문에

    # 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가 한 순간에 '재앙적인 백 트랙킹'으로 실패하는 것을 보는 데 도움이됩니다. – LotPings