通过批处理文件查找和替换文本

通过批处理文件查找和替换文本

我曾见过有人问过这个问题,但从来没有人给出适合我需求的答案

我从事计算机系统的远程技术支持工作,我经常需要做的事情之一是打开 ini 文件,并用新行替换某些行

作为例子我们会说。

程序文件

程序状态 = 客户端

好吧,我需要将其更改为服务器,以便它读取

程序状态 = 服务器

虽然我可以在记事本中打开它,但我希望能够通过批处理文件中的命令行执行此操作,因为我已经有一个为其他所有操作创建的批处理工具。

现在,请注意,并非每台计算机都支持 powershell 脚本,因此这只能在一个批处理文件中。我无法下载任何其他软件,因为这些不是我要连接的系统。

有谁知道这如何通过批处理完成,我完全搞不懂。不想通过命令行打开编辑器,直接运行它,然后 ini 文件中的那行就会更改。

感谢任何意见 -Terra

答案1

此批处理文件还包含一些诊断信息。setlocal 行是必需的,以便正确处理循环中的变量。

使用此方法最显著的副作用是删除了空白行(它们被 FOR 忽略),并且您的测试(在“写出新值”部分)非常具体:空格和大小写很重要。您可以使用 /i 执行不区分大小写的匹配,但由于您在问题中包含了空格,我怀疑您更喜欢包含它们。您需要像该部分中所做的那样包含多行以复制每个可能的比较。

@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.
)

最后,您将需要添加一些内容来覆盖原始文件,例如:

copy /y new.ini test.ini

相关内容