0

Problem:

Update a specific string within numerous configuration files that are found within the subfolders of a partial path using PowerShell.

Expanded Details:

I have multiple configuration files that need a specific string to be updated; however, I do not know the name of these files and must begin my search from a partial path. I must scan each file for the specific string. Then I must replace the old string with the new string, but I must make sure it saves the file with its original name and in the same location it was found. I must also be able to display the results of the script (number of files affected and their names/path). Lastly, this must all be done in PowerShell.

So far I have come up with the following on my own:

$old = "string1"
$new = "string2"

$configs = Get-ChildItem -Path C:\*\foldername\*.config -Recurse
$configs | %{(Get-Content $_) -Replace $old, $new | Set-Content $_FullName

When I run this, something seems to happen. If the files are open, they will tell me that they were modified by another program. However, nothing seems to have changed.

I have attempted various modifications of the below code as well. To my dismay, it only seems to be opening and saving each file rather than actually making the change I want to happen.

$configFiles = GCI -Path C:\*\Somefolder\*.config -Recurse
foreach ($config in $configFiles) {
    (GC $config.PSPath) | ForEach-Object {
        $_ -Replace "oldString", "newString"
   } | Set-Content $config.PSPath)
}

To further exasperate the issue, all of my attempts to perform a simple search against the specified string seems to be posing me issues as well.

Discussing with several others, and based on what have learned via SO... the following code SHOULD return results:

GCI -Path C:\*\Somefolder\*.config -Recurse |
    Select-String -Pattern "string" |
    Select Name

However, nothing seems to happen. I do not know if I am missing something or if the code itself is wrong...

Some questions I have researched and tried that are similar can be found at the below links:

UPDATE: It is possible that I am being thwarted by special characters such as + and /. For example, my string might be: "s+r/ng"

I have applied the escape character that PowerShell says to use, but it seems this is not helping either.

Replacing a text at specified line number of a file using powershell

Find and replacing strings in multiple files

PowerShell Script to Find and Replace for all Files with a Specific Extension

Powershell to replace text in multiple files stored in many folders

I will continue my research and continue making modifications. I'll be sure to notate anything that get's me to my goal or even a step closer. Thank you all in advance.

Ansgar Wiechers
  • 193,178
  • 25
  • 254
  • 328
Brandon
  • 731
  • 2
  • 12
  • 29
  • 1
    I guess your oldstring is full of regex special characters which you're not showing because reasons, and you don't know you need to escape them... – TessellatingHeckler Jul 26 '17 at 18:17
  • This is very possible. The string itself contains + / \ and other similar special characters. I had thoughts that this could be the case, and as you assume, I cannot post the string for specific reasons. – Brandon Jul 26 '17 at 18:20
  • 1
    Then use `[regex]::Escape($old)` or the basic literal string replace method `$_.Replace($old, $new)` – TessellatingHeckler Jul 26 '17 at 18:40
  • 1
    AH HA!! Thank you my friend. Those additional commands made all the difference. Thank you again. – Brandon Jul 26 '17 at 18:49

0 Answers0