PowerShell脚本用于解析根文件夹中的文件

时间:2017-02-16 08:49:40

标签: powershell parsing

我正在编写以下脚本,该脚本尝试读取文本文件,然后使用收集的数据运行算法。该算法必须应用于当前文件夹中的每个文件,因此有2个主循环。

循环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"
        }  
    }
}

编辑:更新了脚本。

1 个答案:

答案 0 :(得分:1)

您的脚本通过每个文件内容($data)循环多次(每个禁用的功能一次),但您只需将过滤操作的结果写入输出而不修改$data

因此,下一个功能循环将运行相同的未经修改的$data内容。如果最后一个禁用的功能不在文件中,则最后一个结果将返回文件内容不变。

您需要将最内层循环的输出捕获到新的字符串数组中,然后在运行下一个特征循环之前将其分配给$data。然后,您可以将最后$data写入所需的输出。

可读性的小改进:也可以使用foreach循环来实现这些功能,例如

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