Clayton Lewis
Clayton Lewis

Reputation: 394

Replace not working when Looping through an Array

Working on a project and I have a need to replace a 'path prefix' with a different prefix. Automating the copying of files and then I will do using those files locally. Rather than making new variables I figured I would re-purpose old ones I would not need after the copy is complete. Ran into an issue with doing a replace when looping through the Array. I was able to find a solution for this particular scenario but would like to understand why my loops were not working

No errors are shown to give me an indication why it is not working.

Any help on understanding why the replace isn't working when looping would be helpful

Sample code of how I am building paths

[string]$Root_Path = "\\Main_Blah_Path\"

[string]$Software = $Root_Path + "Software\"

[string]$Adobe_Reader = $Software + "Adobe_Reader\"
[string]$Firefox = $Software + "Firefox\"
[string]$Google_Chrome = $Software + "Google_Chrome\"

[System.Collections.ArrayList]$List_Of_Software = @(
    $Adobe_Reader
    $Firefox
    $Google_Chrome
)

Example of the ways I have done the replacement. These work and will write the desired output to the console

foreach ($Path in $List_Of_Software) {
    $Path -replace '\\\\Main_Blah_Path\\','C:\Folder\'
}
$List_Of_Software | ForEach-Object {$_ -replace '\\\\Main_Blah_Path\\','C:\Folder\'}

Example of failures I am having. I cannot replace and save the data into itself to do a replacement. I couldn't get .replace to work at all

foreach ($Path in $List_Of_Software) {
    $Path = $Path -replace '\\\\Main_Blah_Path\\','C:\Folder\'
}
$List_Of_Software | ForEach-Object {$_ = $_ -replace '\\\\Main_Blah_Path\\','C:\Folder\'}

foreach ($Path in $List_Of_Software) {
    $Path.Replace('\\\\Main_Blah_Path\\','C:\Folder\')
}

Solution I am using for my current scenario but I can foresee a few things in my future where this method may not be a viable option

$List_Of_Software = $List_Of_Software -replace '\\\\Main_Blah_Path\\','C:\Folder\'

Upvotes: 1

Views: 1415

Answers (1)

arco444
arco444

Reputation: 22831

You're almost there, you just need to assign the results of the replacement back to the variable when you're looping the array. Try:

$List_of_software = $List_Of_Software | 
  ForEach-Object {$_ -replace '\\\\Main_Blah_Path\\','C:\Folder\'}

Upvotes: 1

Related Questions