title: How to Find Replace Multiple strings in multiple text files using Powershell
body: <p>I am new to scripting, and Powershell. I have been doing some study lately and trying to build a script to find/replace text in a bunch of text files (Each text file having code, not more than 4000 lines). However, I would like to keep the FindString and ReplaceString as variables, for there are multiple values, which can in turn be read from a separate csv file.</p>
  
  <p>I have come up with this code, which is functional, but I would like to know if this is the optimal solution for the aforementioned requirement.  I would like to keep the FindString and ReplaceString as regular expression compatible in the script, as I would also like to Find/Replace patterns. (I am yet to test it with Regular Expression Pattern)</p>
  
  <p>Sample contents of Input.csv: (Number of objects in csv may vary from 50 to 500)</p>
  
  <pre><code>FindString  ReplaceString
  AA1A    171PIT9931A
  BB1B    171PIT9931B
  CC1C    171PIT9931E
  DD1D    171PIT9932A
  EE1E    171PIT9932B
  FF1F    171PIT9932E
  GG1G    171PIT9933A
  </code></pre>
  
  <p>The Code</p>
  
  <pre><code>$Iteration = 0
  $FDPATH = 'D:\opt\HMI\Gfilefind_rep'
  #&amp; 'D:\usr\fox\wp\bin\tools\fdf_g.exe' $FDPATH\*.fdf
  $GraphicsList = Get-ChildItem -Path $FDPATH\*.g | ForEach-Object FullName
  $FindReplaceList = Import-Csv -Path $FDPATH\Input.csv
  foreach($Graphic in $Graphicslist){
      Write-Host "Processing Find Replace on : $Graphic"
      foreach($item in $FindReplaceList){
      Get-Content $Graphic | ForEach-Object { $_ -replace "$($item.FindString)", "$($item.ReplaceString)" } | Set-Content ($Graphic+".tmp")
          Remove-Item $Graphic
          Rename-Item ($Graphic+".tmp") $Graphic
          $Iteration = $Iteration +1
          Write-Host "String Replace Completed for $($item.ReplaceString)"
      }
  }
  </code></pre>
  
  <p>I have gone through other posts here in Stackoverflow, and gathered valuable inputs, based on which the code was built. <a href="https://stackoverflow.com/questions/3403217/how-to-replace-multiple-strings-in-a-file-using-powershell" title="This post from Ivo Bosticky">This post from Ivo Bosticky</a> came pretty close to my requirement, but I had to perform the same on a nested foreach loop with Find/Replace Strings as Variables reading from an external source.</p>
  
  <p>To summarize,</p>
  
  <ol>
  <li>I would like to know if the above code can be optimized for
  execution, since I feel it takes a long time to execute. (I prefer
  not using aliases for now, as I am just starting out, and am fine
  with a long and functional script rather than a concise one which is
  hard to understand)</li>
  <li>I would like to add the number of Iterations being carried out in
  the loop. I was able to add the current Iteration number onto the
  console, but couldn't figure how to pipe the output of
  Measure-Command onto a variable, which could be used in Write-Host
  Command. I would also like to display the time taken for code
  execution, on completion.</li>
  </ol>
  
  <p>Thanks for the time taken to read this Query. Much appreciate your support!</p>