2017-02-16 6 views
0

Ich arbeite an folgenden Skript, das versucht, eine Textdatei zu lesen, und dann einen Algorithmus mit den gesammelten Daten ausführen. Der Algorithmus muss auf jede Datei im aktuellen Ordner angewendet werden, sodass es zwei Hauptschleifen gibt.PowerShell-Skript zum Parsen von Dateien aus dem Stammordner

Loop 1 ist für Dateien im Ordner.

Schleife 2 ist für die im Algorithmus verwendeten Textzeileneinträge.

Schleife 3 ist für den Algorithmus selbst.

#$path = (Get-Item -Path ".\" -Verbose).FullName 
$path = split-path -parent $MyInvocation.MyCommand.Definition 
$files = Get-ChildItem "$path\test" -r # root path $PSScriptRoot 

#echo $path 
#echo $files 
#echo $files.Count 
ForEach ($file in $files){ 

    echo "the value of i is" $i 
    #echo $file.FullName 
    #iterate through files from the current folder. 
    $data = Get-Content -Path $files.FullName 

    #echo "$data" 

    # parse DisabledFeatures.txt file as array of strings (1 string per line of the file) 
    $feature = Get-Content "$path\Disabled_Features.txt" 
    #echo $feature.Count 
    #iterate for each string entry in $feature array (read from txt file) 
    for($counter=0; $counter -lt $feature.Count; $counter++){ 

     #retrieve array value to use it in the main algorythm 
     $groupID = $feature[$counter] 
     echo $groupID 
     $data | ForEach-Object -Begin { $ignore = $false; $levels = 0 } -Process { 
      #Start ignoring text after we've found the trigger 
      if($_ -match "^#ifdef $groupID") { 
       $ignore = $true 
       ECHO "TRUE ifdef feature" 
      } 

      #Track nested groups 
      elseif($ignore) { 
       if ($_ -match '^#ifdef') { 
        $levels++ 
        echo "levels++" 
       } 
       elseif ($_ -match '#endif') { 
        if($levels -ge 1) { $levels-- } 
        #If no nesting, we've hit the end of our targeted group. Stop ignoring 
        else { $ignore = $false } 
        echo "stop ignoring" 
       } 
      } 
      #Write line 
      else { $_ } 
      echo "write line" 
     } 
    } 
} 

Bearbeiten: Skript aktualisiert.

+0

'$ i -lt' und' $ counter -lt' – TessellatingHeckler

+1

"Es scheint nicht zu arbeiten" .. * Wie? * Welches Ergebnis erwartest du? Welches Ergebnis bekommst du eigentlich? –

+0

aktualisiert das Skript. Es ist beabsichtigt, Absätze zu löschen, die mit dem #ifdef -Feature beginnen und mit dem entsprechenden #endif enden. Also #ifdef #endif Absätze dazwischen ist egal – Jackson

Antwort

1

Ihr Skript wird mehrfach (einmal für jede deaktivierte Funktion) durch jeden Dateiinhalt ($data) durchlaufen, Sie schreiben jedoch nur das Ergebnis der Filteroperation in die Ausgabe, ohne $data zu ändern.

So läuft die nächste Feature-Schleife über den gleichen, unveränderten $data Inhalt. Wenn sich die letzte deaktivierte Funktion nicht in der Datei befindet, gibt das letzte Ergebnis den Dateiinhalt unverändert zurück.

Sie müssen die Ausgabe der innersten Schleife in einem neuen Zeichenfolgenarray erfassen und diese dann $data zuweisen, bevor Sie die nächste Feature-Schleife ausführen. Sie können dann das letzte $data zu Ihrer gewünschten Ausgabe schreiben.

Minor Verbesserung der Lesbarkeit: eine foreach-Schleife für die Verwendung Einsatz, auch, wie

foreach ($groupID in $feature) 
{ 
    ... 
} 
+0

Können Sie ein Beispiel darüber, wie soll ich die erfasste Zeichenfolge zu $ ​​Data? Ich denke, eine einfache Möglichkeit, es zu erfassen, ist, letzte $ _ in String-Array anhängen? Vielen Dank! – Jackson

+0

Ersetzen Sie $ data | ForEach-Object' mit '$ data = $ data | ForEach-Object', um die gefilterte Ausgabe zu erfassen. Sie müssen die 'echo'-Anweisungen allerdings loswerden oder zu' Write-Host 'ändern. – TToni

+0

Danke, genau das habe ich gebraucht! – Jackson

Verwandte Themen