Home > Software engineering >  Powershell Set-Content fails for one file and succeeds for another?
Powershell Set-Content fails for one file and succeeds for another?

Time:03-12

Trying to modify to different files and getting two different outcomes. The successful file "autoexec.cfg works fine. Here is the file contents and powershell code. c:\temp\autoexec.cfg contains:

disable_write_track = true
webgui_port = 8470

powershell code to modify file:

$WGP = get-random -minimum 8000 -maximum 8999
$line = Get-Content "C:\temp\autoexec.cfg" | Select-String webgui_port | Select-Object -ExpandProperty Line
$content = Get-Content "C:\temp\autoexec.cfg"
$content | ForEach-Object {$_ -replace $line,"webgui_port = $WGP"} | Set-Content "C:\temp\autoexec.cfg"

The file that fails sets up like this. c:\temp\serverSettings.lua contains:

cfg = 
{
    ["port"] = 10302,
} -- end of cfg

powershell code to modify file

$DCSP = get-random -minimum 10000 -maximum 19999
$line = Get-Content "C:\temp\serverSettings.lua" | Select-String port | Select-Object -ExpandProperty Line
$content = Get-Content "C:\temp\serverSettings.lua"
$content | ForEach-Object {$_ -replace $line,"    [\`"port\`"] = $DCSP,"} | Set-Content "C:\temp\serverSettings.lua"

The file does not change except it does. I have the file open in Notepadd and after running the code Notepad sees the file has been changed and wants to reload but there are no changes.

CodePudding user response:

-replace is a regex operator, and [] is a special construct in a regular expression and needs to be escaped properly.

The easiest way to do that is with [regex]::Escape():

$content | ForEach-Object {$_ -replace [regex]::Escape($line),"    [\`"port\`"] = $DCSP,"} | Set-Content "C:\temp\serverSettings.lua"
  • Related