嵌套的while循环仅运行一次

时间:2020-08-12 17:31:55

标签: powershell

我正在尝试使用此脚本将文本添加到文件夹中的每个文件。它正在工作,但仅在文件夹中的第一个文件上。 for语句似乎正在工作,因为它可以准确计算文件夹中的文件数量,但仅修改第一个文件。我觉得我在这里想念一些愚蠢的东西。

   $fullPath = "M:\BHX\DrillTeqConversion"
   $reader = [System.IO.File]::OpenText("M:\BHX\DrillteqConversion.txt")
   $lineNumberx = 25


   function get200Files($path) {
        $mprFiles = @(Get-ChildItem $path -include *.mpr -Recurse)
 
     if ($mprFiles -ne $NULL) {
         $mprFileCount = 0

       For ($i = 0; $i -lt $mprFiles.Length; $i++) {
         $mprFileCount += 1
         $thisFile = $mprFiles[$i]
              
         while($null -ne ($line = $reader.ReadLine())) {

            $textToAdd =  $line
 
            $newLineToAdd =  "`n" 

                 $fileContent = Get-Content $thisFile
                 $fileContent[$lineNumberx-1] += $newLineToAdd
         

                 $fileContent[$lineNumberx-1] += $textToAdd
                 $fileContent | set-Content $thisFile


            $lineNumberx = $lineNumberx + 1

         
          }
       }

       Write-Host ("A total of " + $mprFileCount + " files were converted.")
     }
   }

   get200Files $fullPath

1 个答案:

答案 0 :(得分:0)

带有[System.IO.File]::OpenText("M:\BHX\DrillteqConversion.txt")

ReadLine()仅允许一次读取文件。因此,如果不重新打开文件或使用其他策略,就无法无休止地循环浏览文件。为了简化起见,下面的代码示例已减少。

for ($i = 0; $i -lt $mprFiles.Length; $i++) {
    # for loop code before while loop
    $reader = [System.IO.File]::OpenText("M:\BHX\DrillteqConversion.txt")
    while($null -ne ($line = $reader.ReadLine())) {
        # while loop code
    }
    # After while loop but inside of For loop
    $reader.Dispose()
    $reader.Close()
}

您可以为函数创建一个新参数,并将其传递到OpenText()中。

function get200Files($path,$FileToRead) {
    for ($i = 0; $i -lt $mprFiles.Length; $i++) {
        # for loop code before while loop
        $reader = [System.IO.File]::OpenText($FileToRead)
        while($null -ne ($line = $reader.ReadLine())) {
            # while loop code
        }
        # After while loop but inside of For loop
        $reader.Dispose()
        $reader.Close()
    }
}

$fullPath = "M:\BHX\DrillTeqConversion"
$ReaderPath = "M:\BHX\DrillteqConversion.txt"
get200Files $fullPath $ReaderPath