2017-02-16 49 views
0

我正在嘗試讀取文本文件的以下腳本,然後使用收集的數據運行算法。該算法必須應用於當前文件夾中的每個文件,因此有2個主循環。從根文件夾解析文件的PowerShell腳本

循環1用於文件夾中的文件。

循環2用於算法中使用的文本行條目。

循環3用於算法本身。

#$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" 
     } 
    } 
} 

編輯:更新腳本。

+0

'$ I -lt'和'$計數器-lt' – TessellatingHeckler

+1

「這似乎並沒有工作」 .. *如何?*你期望什麼結果?你實際得到了什麼結果? –

+0

更新了腳本。它旨在刪除使用#ifdef特性進行starifying的段落,並以相應的#endif結尾。所以#ifdef #endif之間的段落不關心 – Jackson

回答

1

您的腳本循環多次(一次爲每個殘疾功能)通過每個文件的內容($data),但你只是寫一個過濾器操作的輸出結果,而無需修改$data

因此,下一個功能循環會在同一個未修改的內容中運行。如果上次禁用的功能不在文件中,則最後的結果會返回文件內容不變。

您需要將最內層循環的輸出捕獲到新的字符串數組中,然後在運行下一個功能循環之前將其分配給$data。然後,您可以將最後的$data寫入所需的輸出。

的可讀性次要改進:使用foreach循環的特點,太像

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

你能否提供一個關於如何將捕獲的字符串傳遞給$ Data的示例? 我想一個簡單的方法來捕獲它是通過追加最後$ _字符串數組? 非常感謝! – Jackson

+0

替換'$ data |使用'$ data = $ data |的ForEach-Object' ForEach-Object「來捕獲過濾後的輸出。你必須擺脫'echo'語句,或者將它們改爲'Write-Host' – TToni

+0

謝謝,這正是我需要的! – Jackson

相關問題