找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 57637|回复: 52

[文本处理] 批处理如何读取php.ini配置文件插入指定内容?

[复制链接]
发表于 2025-1-21 23:02:52 | 显示全部楼层 |阅读模式
本帖最后由 piazini 于 2025-1-31 21:54 编辑

各位佬们,请教个问题。
php 每次升级,都要配置里面的某些参数(不用老的覆盖是因为怕有新内容注意不到,对比又费事麻烦,版本多的时候一个个对比,不太友好)
这里随便找个参数作为例子:
  1. ; cgi.fix_pathinfo = 0
复制代码
我想在遍历 php.ini-dist 这个文件时,如果发现有。这个字符串
  1. ; cgi.fix_pathinfo = 0
复制代码
那么就把;(封号去掉)或者插入没有;封号开头的内容
  1. cgi.fix_pathinfo = 1
复制代码
想要的结果是,在 php.ini-dist 原有内容基础上,插入 cgi.fix_pathinfo = 1,并生成新文件 php.ini

在for循环时候,会自动把;封号开头的内容过滤掉,所以可能导致下面方法没有成功。
用替换方法,没成功

  1. set "PHP_INI_FILE=php.ini-dist"
  2. for /f "delims=" %%i in ('type "%PHP_INI_FILE%"') do (
  3.             set "line=%%i"
  4.             set "line=!line:%SEARCH_TEXT%=%REPLACE_TEXT%!"
  5.             echo !line!>>"php.ini"
  6. )
复制代码
用if判断方法,没成功

  1. set "PHP_INI_FILE=php.ini-dist"
  2. for /f "delims=" %%i in ('type "%PHP_INI_FILE%"') do (
  3.             set "line=%%i"
  4.             if "!line!" == "%SEARCH_TEXT%" (
  5.                 echo "%REPLACE_TEXT%" >> "%OUTPUT_FILE%"
  6.             )
  7.             echo !line!>>"php.ini"
  8. )
复制代码
所以,请问,这个我要怎么弄才能达到效果

----------------------------------------------------------------------------------------------------------
2025年1月31日 更新:
经过楼下各位佬的解答,脚本功能已经完成。
可以直接跳到53楼查看
或者 点击连接查看
http://www.bathome.net/redirect. ... 0471&pid=287334
发表于 2025-1-22 00:05:22 | 显示全部楼层
for /f 默认忽略分号开头的行 使用eol选项换成其他
例如换成忽略问号(?)开头的行
for /f "eol=? delims=" ........
发表于 2025-1-22 00:09:43 | 显示全部楼层
; cgi.fix_pathinfo = 0cgi.fix_pathinfo = 1
来自不同的文本?请按 a 文本 b 文本,及希望得到的c 文本,给出一个例子吧
发表于 2025-1-22 10:51:47 | 显示全部楼层
回复 1# piazini

订正一楼第二段代码如下

  1. @echo off &setlocal
  2. set "PHP_INI_FILE=php.ini-dist"
  3. set "SEARCH_TEXT=; cgi.fix_pathinfo = 0"
  4. set "REPLACE_TEXT=cgi.fix_pathinfo = 1"
  5. (for /f "eol=╟ delims=" %%i in (%PHP_INI_FILE%) do (
  6.     if /i "%%i"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%i
  7. ))>"php.ini"
  8. pause&exit/b
复制代码
发表于 2025-1-22 11:57:39 | 显示全部楼层
本帖最后由 WHY 于 2025-1-22 13:36 编辑

PowerShell "(gc 1.txt) -replace '^; *(?=cgi.fix_pathinfo *=)'"
 楼主| 发表于 2025-1-22 16:57:11 | 显示全部楼层
回复 2# Five66
没有要忽略的行,就是如果没有我想替换的字符串,那么原始的ini内容就全部写到新的ini文件里
 楼主| 发表于 2025-1-22 16:58:26 | 显示全部楼层
回复 3# 77七
不想修改原始文件,就想读取 原始文件内容,把要替换的字符串替换了,然后生成新文件
 楼主| 发表于 2025-1-22 17:00:10 | 显示全部楼层
回复 4# aloha20200628
eol=╟ 和  (echo,%REPLACE_TEXT%) 没看懂。

eol 为啥要忽略的是╟ ?
echo 后不是空格显示内容么?
 楼主| 发表于 2025-1-22 17:01:24 | 显示全部楼层
回复 5# WHY

谢谢,但是想用 bat 实现
发表于 2025-1-22 17:13:07 | 显示全部楼层
回复 8# piazini

eol=╟  找一个键盘可见字符之外的一个 ascii 非控制字符就是了...
echo,... 只是一个习惯用法,避免用空格可能会导致系统报错(当输出值为空时)
发表于 2025-1-22 17:48:31 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-1-22 17:51 编辑


复查了 dostips.com 的老帖,发现彻底取消 eol= 参数及其默认值的一个妙招,可用其重写4楼代码如下...

  1. @echo off
  2. set "PHP_INI_FILE=php.ini-dist"
  3. set "SEARCH_TEXT=; cgi.fix_pathinfo = 0"
  4. set "REPLACE_TEXT=cgi.fix_pathinfo = 1"
  5. (for /f "delims="eol^= %%i in (%PHP_INI_FILE%) do (
  6.         if /i "%%i"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%i
  7. ))>"php.ini"
  8. pause&exit/b
复制代码
发表于 2025-1-24 08:45:19 | 显示全部楼层
bat相关的 "奇技淫巧",这个论坛多的是。前提是你愿意翻、愿意学。
http://bbs.bathome.net/thread-15748-1-8.html
 楼主| 发表于 2025-1-27 12:45:03 | 显示全部楼层
回复 11# aloha20200628


    ;封号开头的内容保留成功了,但是 空行和要替换的字符串没成功
发表于 2025-1-27 13:44:12 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-1-27 15:56 编辑

回复 13# piazini

以下代码会保留源文件中的空行,此法同时会避免 ‘分号起始行’ 问题...
楼主切记:代码中的 %SEARCH_TEXT% 变量值须确保是从源文件中全行复制过来

  1. @echo off
  2. set "PHP_INI_FILE=php.ini-dist"
  3. set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
  4. set "REPLACE_TEXT=cgi.fix_pathinfo=1"
  5. (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
  6.     if /i "%%b"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%b
  7. ))>"php.ini"
  8. pause&exit/b
复制代码
发表于 2025-1-27 13:59:44 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-1-27 16:15 编辑

回复 13# piazini

    再给一个 bat+sed 版本(存为 test.bat 运行)以供参考》其中 sed.exe 可从本坛第三方下载,落地即用,与批处脚本同目录 (http://bcn.bathome.net/s/tool/index.html?key=sed
    用 sed.exe 处理文本文件,没有空行和分号起始行等问题...

  1. @echo off & setlocal
  2. set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
  3. set "REPLACE_TEXT=cgi.fix_pathinfo=1"
  4. sed.exe "s/%SEARCH_TEXT%/%REPLACE_TEXT%/gi" "php.ini-dist">"php.ini"
  5. pause&exit/b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 13:56 , Processed in 0.024707 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表