我曾见过有人问过这个问题,但从来没有人给出适合我需求的答案
我从事计算机系统的远程技术支持工作,我经常需要做的事情之一是打开 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