2016-12-07 6 views
1

Ich muss die folgende Ausgabe von einem dirquota au l Befehl auf einem Server 2008 R2, iterieren Sie durch jede Zeile, fügen Sie die relevanten Daten für jeden Auto-Quota-Pfad zu seinem eigenen einzigartigen Objekt, dann alle hinzufügen der Objekte zu einem Array. Siehe Beispiel unten:Schleife durch Absätze, erstellen Sie einzelne Objekte

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\E\Dir\SubDir 
         \\SERVER\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log

Nehmen wir zum Beispiel jedes Auto Quote, und ich möchte die „automatisch zugewiesenen Kontingents Pfad:“ isolieren Teil, das ich weiß, dass ich mit RegEx tun kann und Select-String, hinzufügen, dass auf ein Objekt unter der Eigenschaft "Name" isolieren Sie dann den "E: \ Dir \ Subdir" Teil und fügen Sie das zu demselben Objekt unter der Eigenschaft "Value" hinzu. Ich möchte dann die Daten von Source Template und Limit sammeln und diese zum gleichen Objekt hinzufügen. Sobald die leere Zeile erreicht ist, fügen Sie das gerade erstellte Objekt zu einem Array hinzu, leeren Sie die Objektvariable und beginnen Sie, den nächsten automatischen Kontingentabschnitt zu durchlaufen, wobei Sie denselben Prozess durchlaufen.

Hier ist der Code, den ich mit so weit bin arbeiten:

$AutoQuota = @() 
$AutoQuota = dirquota au l 
$AutoQuota = $AutoQuota[2..$AutoQuota.Count] 
$obj = New-Object PSObject 
$objArr = @() 

$AutoQuota | % { 
    switch -regex ($_) { 
     "^Auto.*" { 
      $Name = $_ | Select-String -Pattern "^Auto*: " | 
        %{$_.Matches} | %{$_.Value} 
      $Value = $_ | Select-String -Pattern "\w:*" | 
        %{$_.Matches} | %{$_.Value} 
      $obj | Add-Member -MemberType NoteProperty -Name $Name -Value $Value 
     } 
     "^\s*$" { 
      $objArr += $obj 
      $obj = @() 
     } 
    } 
} 

Es wird offensichtlich auf die switch Aussage mehr, ich will nur die erste Zeile erhalten wie erwartet funktioniert, dann werde ich hinzufügen der Rest. Wenn es einen leichteren/besseren Weg gibt, bin ich offen für Vorschläge.

Antwort

0

die Befehlsausgabe an einen einzelnen String Konvertieren und Spaltung, die Zeichenfolge in zwei aufeinanderfolgenden Zeilenumbrüchen (Windows kodiert, Zeilenumbrüche als CR-LF, so müssen Sie \r\n für jeden Zeilenumbruch)

(dirquota au l | Out-String) -split '\r\n\r\n' 

dann durch einen Filter regulärer Ausdruck, gruppiert die Werte, die Sie aus dem Teil extrahieren mögen, und die Objekte direkt aus den Spielen konstruieren:

$re = 'Auto Apply Quota Path:\s+(.*)[\s\S]*?' + 
     'Source Template:\s+(.*)\s+' + 
     'Limit:\s+(.*)' 

... | Where-Object { $_ -match $re } | ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
    Path  = $matches[1] 
    Template = $matches[2] 
    Limit = $matches[3] 
    } 
} 
+0

Sieht so aus, als ob dies mich auf den richtigen Weg bringt. Das einzige Problem ist, dass ich nur ein Ergebnis aus dem ersten Datenblock bekomme. Ich renne in '(dirquota au l | Aus-String) -split '\ n \ n'' zum' Where-Object', ist das korrekt? –

+0

@AshHousewares Ja. Die Zeilenumbrüche können jedoch auch als CR-LF codiert sein, also prüfe auch '-split' \ r \ n \ r \ n''. Überprüfen Sie außerdem, ob die Leerzeilen in der erfassten Befehlsausgabe beibehalten werden und dass die Leerzeilen keine anderen Leerzeichen enthalten. –

+0

OK, so dass die '-Split \ n \ n' die Zeichenfolge nicht teilt, da die Ausgabe nur 1 Element enthält, also stimmt sie mit der ersten überein und das ist es. Wenn ich auf eine einzelne neue Zeile aufteile, bekomme ich 53 Elemente, wie erwartet, weil 53 Zeilen ausgegeben werden. Ich vermute, dass das Aufteilen auf 2 neue Zeilen aus irgendeinem Grund nicht funktioniert, vielleicht aufgrund des Formats der String-Ausgabe? –

0

Etwas versuchen, wie diese

[email protected]" 
{Groupement*:Auto Apply Quota Path: {QuotaPath:c:\Tmp\tmp2} 
Share Path:    {SharePaths:\\Server\ 
         Yy2 
         Zz3} 
Source Template:  {SourceTemplate:Template xxx (Matches template)} 
Limit:     {Limit:600.00 MB (Hard)} 
Thresholds: 
    Warning (80%):  {TWarning:Event0 Log0} 
    Limit (100%):  {LWarning:Event0 Log0}} 

{Groupement*:Auto Apply Quota Path: {QuotaPath:Zxx} 
Share Path:    {SharePaths:Xx3 
         Yy4 
         Zz5} 
Source Template:  {SourceTemplate:Template (Matches template)} 
Limit:     {Limit:500.00 MB} 
Thresholds: 
    Warning (100%):  {TWarning:Event1 Log1} 
    Limit (100%):  {LWarning:Event1 Log1}} 
"@ 

$result=$AutoQuota | ConvertFrom-String -TemplateContent $template 
$result.groupement | select QuotaPath, SharePaths, SourceTemplate, Limit, TWarning, LWarning 
Verwandte Themen