[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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

for /f 默认忽略分号开头的行 使用eol选项换成其他
例如换成忽略问号(?)开头的行
for /f "eol=? delims=" ........

TOP

; cgi.fix_pathinfo = 0cgi.fix_pathinfo = 1
来自不同的文本?请按 a 文本 b 文本,及希望得到的c 文本,给出一个例子吧
bat小白,请多指教!谢谢!

TOP

回复 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
复制代码

TOP

本帖最后由 WHY 于 2025-1-22 13:36 编辑

PowerShell "(gc 1.txt) -replace '^; *(?=cgi.fix_pathinfo *=)'"

TOP

回复 2# Five66
没有要忽略的行,就是如果没有我想替换的字符串,那么原始的ini内容就全部写到新的ini文件里

TOP

回复 3# 77七
不想修改原始文件,就想读取 原始文件内容,把要替换的字符串替换了,然后生成新文件

TOP

回复 4# aloha20200628
eol=╟ 和  (echo,%REPLACE_TEXT%) 没看懂。

eol 为啥要忽略的是╟ ?
echo 后不是空格显示内容么?

TOP

回复 5# WHY

谢谢,但是想用 bat 实现

TOP

回复 8# piazini

eol=╟  找一个键盘可见字符之外的一个 ascii 非控制字符就是了...
echo,... 只是一个习惯用法,避免用空格可能会导致系统报错(当输出值为空时)

TOP

本帖最后由 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
复制代码

TOP

bat相关的 "奇技淫巧",这个论坛多的是。前提是你愿意翻、愿意学。
http://bbs.bathome.net/thread-15748-1-8.html

TOP

回复 11# aloha20200628


    ;封号开头的内容保留成功了,但是 空行和要替换的字符串没成功

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 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
复制代码

TOP

返回列表