What I am trying to do is add 1 to $b each time it replaces the word hello with modal$b so it should look like modal1, modal2 etc.
$a=1
$b=1
$original_file = 'C:\Users\me\Desktop\2.txt'
$destination_file = 'C:\Users\me\Desktop\4.txt'
do {
(Get-Content $original_file) | ForEach-Object {
$_ -replace "hello", "modal$b"`
} | add-Content $destination_file
$a
}
until ($a -gt 1)
Any help would be greatly appreciated! thanks, Sarash
CodePudding user response:
You could do it with just a ForEach-Object loop, there doesn't seem to be a need for the Do loop. Following what you already have, you can increase your variable like below.
$original_file = 'C:\Users\me\Desktop\2.txt'
$destination_file = 'C:\Users\me\Desktop\4.txt'
$b = 0
Get-Content $original_file | ForEach-Object {
$_ -replace 'hello', "modal$(($b ))"
} | Out-File $destination_file
The following would work too, using a Regex.Replace with a Script Block, this example would require to use the -Raw switch on Get-Content. It's important to note that using this method, the pattern is case sensitive (i.e.: 'Hello' will not match 'hello'), if you want it to be case-insensitive you could use the (?i) flag: '(?i)hello'.
[ref]$ref = 0
[regex]::Replace((Get-Content $original_file -Raw), 'hello', {
"modal$(($ref.Value ))"
}) | Out-File $destination_file
Replacement with a script block was implemented in PowerShell 6 (Core), thanks Mathias R. Jessen for the hard work :)
Above example, if you have PS Core, would be replaced by:
[ref]$ref = 0
(Get-Content $original_file -Raw) -replace 'hello', {
"modal$(($ref.Value ))"
} | Out-File $destination_file
And there wouldn't be a need for the (?i) flag since -replace is already case-insensitive.
