返回列表 发帖
回复 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

回复 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

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

回复 16# piazini

14楼代码中就是要用 %%b
再问你的真实替换关键词包含中文吗? 源文件是 ansi 编码还是 utf-8 编码?

TOP

本帖最后由 aloha20200628 于 2025-1-27 15:00 编辑

回复 21# piazini

21楼代码第一行 set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
而1楼中的原值是 ; cgi.fix_pathinfo = 0
这两者有差别! 你确认哪个为真?再将真值替换进14楼代码相应位置就是了...

TOP

本帖最后由 aloha20200628 于 2025-1-27 16:44 编辑

回复 22# piazini

用以下两行订正了14楼代码
set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
set "REPLACE_TEXT=cgi.fix_pathinfo=1"
再用20楼所附下载文件中的 php.ini-dist (ansi 编码或 utf-8 编码皆可,共1284行)测试已经顺利通过(输出文件 php.ini 在第520行已被正确修改,1284行输出,其中 ! 字符没有丢失...)

TOP

本帖最后由 aloha20200628 于 2025-1-29 20:12 编辑

回复 26# piazini

24楼报告结果表明用14楼代码处理20楼所附 'php-5.2.9-Win32.zip' 中的 php.ini-dist 文件(该文件是ansi编码,1284行,没有中文字符,仅在第520行出现被替换字段)已经顺利通过
处理结果是第520行被正确替换,且全文中的 ! 字符均得以保留(包括113、193、316、401、772、807行中的 ! 字符)因为14楼代码全程没有开启延迟变量,字符串包含的 ! 字符不会被转义求值...
楼主采用的全部测试代码中除了14楼代码还有其他前置代码吗?被测试的是这个 php-5.2.9-Win32.zip' 中的 php.ini-dist 文件吗

TOP

本帖最后由 aloha20200628 于 2025-1-29 21:18 编辑

回复 26# piazini

再改用另一个方法替换处理 php.ini-dist 文件,楼主可试试以下代码,存为 test.bat 运行,与 php.ini-dist 文件同目录 ...
  1. @echo off &endlocal &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 "tokens=1 delims=:" %%a in ('findstr /n ".*" "%PHP_INI_FILE%"^|findstr /ic:"%SEARCH_TEXT%" ') do set "_#%%a=1"
  6. (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
  7.     if defined _#%%a (echo,%REPLACE_TEXT%) else echo,%%b))>"php.ini"
  8. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2025-1-29 22:29 编辑

回复 36# piazini

如果仅是解决一楼的问题,用14楼代码完全可以结帖了
但楼主 实际要解决的问题和实际采用的代码 并非完全如此,这就很容易把解答者带入 ‘迷阵’...

TOP

回复 45# piazini

   复盘一下本帖》你虽然明示了要处理的数据文件是 php.ini-dist,但始终不知道你实际测试采用的完整代码,如果及时贴出来的话,大家会对你不断丢出的 ‘奇怪问题’ 早就一目了然了...
   至于在批处代码中可否实现类似python字典替换的问题,须提供一个示例来明确表述...

TOP

本帖最后由 aloha20200628 于 2025-1-31 15:04 编辑

回复 49# piazini

   这是新手在同一cmd进程窗口中多次调试同一批处脚本的常见错误,根本原因是还未了解cmd的 ‘预处理’ 机制 》简言之就是对那些用&连接或用()包裹的 ‘复合语块’ (典型如 if... 和 for...)在被实际执行前,会将其中的所有 %var% 变量预先赋值,而无视所在语块中已有的赋值命令。
   因此,49楼代码第一次运行后留存的 %SEARCH_TEXT% 变量值会在代码第二次运行时被 ‘预处理’ 预先赋值给所有复合语块中的 %SEARCH_TEXT% 变量,从而出现楼主报告的 ‘奇怪’ 现象。
   最简洁的解决方法至少有两个,一是全程采用延迟变量,但这会拦截文件读取的!字符,除非改用分段管理延迟变量的对策,但如此代码量会增加;
   二是要在脚本头部(即所有复合语块之前)对其后不同复合语块中引用的 %SEARCH_TEXT% 和 %REPLACE_TEXT% 分别赋值,例如
   set "SEARCH_TEXT529=; cgi.fix_pathinfo=0"
   set "REPLACE_TEXT529=cgi.fix_pathinfo=1"
   set "SEARCH_TEXT541=;cgi.fix_pathinfo=1"
   set "REPLACE_TEXT541=cgi.fix_pathinfo=1"
   其后再调整相应复合语块中的引用变量名即可。

TOP

返回列表