我正在编写以下脚本,该脚本尝试读取文本文件,然后使用收集的数据运行算法。该算法必须应用于当前文件夹中的每个文件,因此有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"
}
}
}
编辑:更新了脚本。
答案 0 :(得分:1)
您的脚本通过每个文件内容($data
)循环多次(每个禁用的功能一次),但您只需将过滤操作的结果写入输出而不修改$data
。
因此,下一个功能循环将运行相同的未经修改的$data
内容。如果最后一个禁用的功能不在文件中,则最后一个结果将返回文件内容不变。
您需要将最内层循环的输出捕获到新的字符串数组中,然后在运行下一个特征循环之前将其分配给$data
。然后,您可以将最后$data
写入所需的输出。
可读性的小改进:也可以使用foreach循环来实现这些功能,例如
foreach ($groupID in $feature)
{
...
}