Well, I'm officially stuck.
I'm working on a PowerShell script that finds all the files with PATTERN within a given DIRECTORY, prints out the relevant lines of the document with the PATTERN highlighted, and then replaces the PATTERN with a provided REPLACE word, then saves the file back. So it actually edits the file.
Except I can't get it to alter the file, because Windows complains about the file already being open. I tried several methods to solve this, but keep running into the issue. Perhaps someone can help:
Spoiler param( [string] $pattern = "" ,[string] $replace = "" ,[string] $directory ="." ,[switch] $recurse = $false ,[switch] $caseSensitive = $false)if($pattern -eq $null -or $pattern -eq ""){ Write-Error "Please provide a search pattern." ; return}if($directory -eq $null -or $directory -eq ""){ Write-Error "Please provide a directory." ; return}if($replace -eq $null -or $replace -eq ""){ Write-Error "Please provide a string to replace." ; return}$regexPattern = $patternif($caseSensitive -eq $false) { $regexPattern = "(?i)$regexPattern" }$regex = New-Object System.Text.RegularExpressions.Regex $regexPatternfunction Write-HostAndHighlightPattern([string] $inputText){ $index = 0 $length = $inputText.Length while($index -lt $length) { $match = $regex.Match($inputText, $index) if($match.Success -and $match.Length -gt 0) { Write-Host $inputText.SubString($index, $match.Index) -nonewline Write-Host $match.Value.ToString() -ForegroundColor Red -nonewline $index = $match.Index + $match.Length } else { Write-Host $inputText.SubString($index) -nonewline $index = $inputText.Length } }}Get-ChildItem $directory -recurse:$recurse | Select-String -caseSensitive:$caseSensitive -pattern:$pattern | foreach { $file = ($directory + $_.FileName) Write-Host "$($_.FileName)($($_.LineNumber)): " -nonewline Write-HostAndHighlightPattern $_.Line %{ Set-Content $file ((Get-Content $file) -replace ([Regex]::Escape("[$pattern]")),"[$replace]")} Write-Host "`n" Write-Host "Processed: $($file)" } The issue is located within the final block of code, right at the Get-ChildItem call. Of course, some of the code in that block is now a bit mangled due to me trying to fix the problem then stopping, but keep in mind the intent of that part of the script. I want to get the content, replace the words, then save the altered text back to the file I got it from.
Any help at all would be greatly appreciated.