Find and replace text via batch file
I have seen this question asked but never with a suitable answer for what I need
I work doing remote tech support on computer systems and one of the things I frequently need to do is open ini files and replace certain lines with a new one
as an example we will say.
program.ini
program status = client
Well I would need to change that to server so it reads
program status = server
While yes I can open it in notepad I want to be able to do this via command line in a batch file as I already have a batch tool I have created for everything else I do.
Now, note that not every computer supports powershell scripts so this has to be just in the one batch file. I can not download any additional software as these are not my systems I am connecting to.
Anyone know how this would be done purely via batch as I am at a loss. Not looking to open an editor via command line, just a straight up run it and that line is changed in the ini file.
Thanks for any input -Terra
61 Answer
This batch file includes some diagnostic information, too. The setlocal line is REQUIRED in order to properly play with variables in a loop.
The most significant side-effects of using this method are that blank lines are removed (they're ignored by FOR) and that your tests (in the "write out the new value" section) are very specific: spaces and case matter. You can perform case insensitive matching with /i, but since you're including the spaces in your question I suspect you prefer to include them. You'll need to include multiple lines as done in that section to replicate each possible comparison.
@ECHO OFF
setlocal enableDelayedExpansion
FOR /F "tokens=1,* delims==" %%i IN (test.ini) DO ( SET sdone=0 SET "sname=%%i" SET "svalue=%%j" ECHO.Name: !sname! ECHO.Value: !svalue! :: write out headers IF "!sdone!"=="0" IF "!sname:~0,1!"=="[" SET sdone=1&&ECHO.Type: Header&&ECHO.!sname!>>new.ini :: write out the new value if it's client IF "!sdone!"=="0" IF "!sname!"=="program status" IF "!svalue!"=="client" SET sdone=1&&ECHO.Type: Rewrite&&ECHO.!sname!=server>>new.ini IF "!sdone!"=="0" IF "!sname!"=="program status " IF "!svalue!"==" client" SET sdone=1&&ECHO.Type: Rewrite&&ECHO.!sname!=server>>new.ini :: write out anything else IF "!sdone!"=="0" SET sdone=1&&ECHO.Type: Content&&ECHO.!sname!=!svalue!>>new.ini :: a little padding to read the debug info ECHO.
)At the end you'll want to add something to overwrite the original file, something like:
copy /y new.ini test.ini 1 More in general
"Zoraya ter Beek, age 29, just died by assisted suicide in the Netherlands. She was physically healthy, but psychologically depressed. It's an abomination that an entire society would actively facilitate, even encourage, someone ending their own life because they had no hope. Th…"