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

帮楼主发个个php.ini-dist文件
不知行否
https://gofile.io/d/v1V6Os

TOP

本帖最后由 piazini 于 2025-1-27 15:36 编辑

回复 22# aloha20200628

新版本的 等号两边是有空格的,是我在后来用了老版本的测试,导致描述不一致,抱歉。

那就先用 ; cgi.fix_pathinfo=0 这个来示例说明把。
现在空行是可以保留了,但是:替换还是没成功,而且文件里只要是 !叹号的地方,都被替换成空了

我也没有权限上传图片

结果到98%,马上和我 想要的结果一样了。

TOP

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

回复 21# piazini

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

TOP

回复 18# aloha20200628
没有任何中文,下面是我的代码 :
  1. set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
  2.         set "REPLACE_TEXT=cgi.fix_pathinfo = 1"
  3.         (for /f "delims=" %%i in ('findstr /n ".*" %PHP_INI_FILE%') do (
  4.             if /i "%%i"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%i
  5.         ))>"%OUTPUT_FILE%"
复制代码
要替换的%SEARCH_TEXT%内容,是从php-5.2.9-Win32 文件夹的 php.ini-dist 里复制出来的,VScode 显示是 UTF-8的编码

附件不能上传,你可以到 这个链接下载文件:https://museum.php.net/php5/php-5.2.9-Win32.zip

TOP

本帖最后由 Five66 于 2025-1-27 15:56 编辑

找个不会出现在行开头的字符作为eol值
开头是行号,其实不用eol也行
已编辑
  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. (
  6. for /f "delims=" %%i in ('findstr /n .* "%PHP_INI_FILE%"') do (
  7. set "line=%%i"
  8. setlocal enabledelayedexpansion
  9. set "line=!line:*:=!"
  10. if /i "!line!" == "!SEARCH_TEXT!" (
  11. echo(!REPLACE_TEXT!||/ ^)
  12. ) else (
  13. echo(!line!||/ ^)
  14. )
  15. endlocal
  16. )
  17. )>"php.ini"
  18. pause&exit/b
复制代码

TOP

回复 16# piazini

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

TOP

回复 15# aloha20200628


    喜欢用原生的东西,换环境不用额外装东西,不过也非常感谢提醒

TOP

本帖最后由 piazini 于 2025-1-27 14:20 编辑

回复 14# aloha20200628
谢谢你,这么快就回答我问题。以为快过年了,都忙着了。

for 里是 %%a 而if 是 %%b 是写错了?
空行保留了,但是前面有了行号。
来源字符串也是从源文件里复制粘贴到bat脚本里的,但是还是不行。

我在这个贴子http://www.bathome.net/redirect. ... 6383&pid=173035
也看到保留空行方式了,和你一样

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

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

回复 11# aloha20200628


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

TOP

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

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

回复 8# piazini

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

TOP

返回列表