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

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

回复 27# piazini


   新年好!  代码前如果有其它代码 开启了延迟变量扩展,需关闭
  1. @echo off
  2. set "file=D:\php-5.2.9-Win32\php.ini-dist"
  3. rem a对应b,不需要空格
  4. set "#"a"=b"
  5. set "#"cgi.fix_pathinfo"=1"
  6. rem 替换为空值,则值为 / 在21行判断,如
  7. set "#"c"=/"
  8. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
  9. if "%%b" neq "" (
  10. for /f "delims==" %%c in (" %%b") do (
  11. for /f "tokens=1* delims=; " %%d in ("%%c") do (
  12. if defined #"%%d" (
  13. if "%%e" equ "" (
  14. for /f "tokens=* delims=; " %%f in (" %%b#") do (
  15. for /f "tokens=1* delims==" %%g in ("%%f") do (
  16. for /f "tokens=*" %%i in ("%%h") do (
  17. set str=%%f
  18. setlocal enabledelayedexpansion
  19. if "!#"%%d"!" equ "/" (
  20. echo=%%g=
  21. ) else (
  22. call echo=!str:%%i=%%#"%%d"%%!
  23. )
  24. endlocal
  25. set m_e=1
  26. )
  27. )
  28. )
  29. )
  30. )
  31. )
  32. )
  33. )
  34. if defined m_e (
  35. set m_e=
  36. ) else (
  37. echo=%%b
  38. )
  39. )) > "out.txt"
  40. rem move "out.txt" "%file%"
  41. pause
复制代码
bat小白,请多指教!谢谢!

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

本帖最后由 piazini 于 2025-1-29 21:31 编辑

回复 33# 77七


    我确实开启了延迟变量,但是遇到个问题,在if exist 前用endlocal关闭了延迟变量,但是"%INPUT_FILE_52_dev%" 为什么会成空值?
    我用%%包裹的变量也会收到影响?
  1.    set "INPUT_FILE_52_dev=php.ini-dist"
  2.    setlocal enabledelayedexpansion
  3.     <略 去一些其他代码>
  4.    endlocal
  5.    @REM 获取配置文件
  6.     set PHP_INI_FILE=
  7.     if exist "%INPUT_FILE_52_dev%" (
  8.         set PHP_INI_FILE="%INPUT_FILE_52_dev%"
  9.     ) else if exist "%INPUT_FILE_dev%" (
  10.         set PHP_INI_FILE="%INPUT_FILE_dev%"
  11.     ) else (
  12.         echo. & echo.
  13.         echo [ Error ] 没有匹配的 dev 版 ini 配置文件:%PHP_INI_FILE% !!!
  14.         echo. & echo. & pause & exit /b
  15.     )
复制代码
输出结果:
  1. [ Error ] 没有匹配的 dev 版 ini 配置文件: !!!
复制代码

TOP

回复  piazini

24楼报告结果表明用14楼代码处理20楼所附 'php-5.2.9-Win32.zip' 中的 php.ini-dist 文件 ...
aloha20200628 发表于 2025-1-29 19:04


33楼给了提示,可能和我开启延迟变量有关系。但是在没有用到叹号包裹的地方关闭延迟变量,%%包裹的变量会出现空值。

TOP

回复 35# piazini


   setlocal和endlocal之间设置的变量为区域变量
bat小白,请多指教!谢谢!

TOP

回复 37# 77七

是我描述的问题,变量设置不在延迟变量的范围。
35楼内容修改了,麻烦你再看看

TOP

回复 38# piazini


   如果用相对路径,检查下脚本的工作目录
bat小白,请多指教!谢谢!

TOP

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

回复 36# piazini

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

TOP

  1. rem 另存为 ANSI 编码 bat
  2. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit /b
  3. PHP_INI_FILE = "php.ini-dist"
  4. SEARCH_TEXT  = "; cgi.fix_pathinfo = 0"
  5. REPLACE_TEXT = "cgi.fix_pathinfo = 1"
  6. OUT_FILE     = "php.ini"
  7. Set oStream = CreateObject("ADODB.Stream")
  8. oStream.Type = 2
  9. oStream.Mode = 3
  10. oStream.Charset = "GBK"
  11. oStream.Open()
  12. oStream.LoadFromFile PHP_INI_FILE
  13. s = oStream.ReadText()
  14. oStream.Close()
  15. m = Replace(SEARCH_TEXT, " ", "")
  16. m = Replace(m, ".", "\.")
  17. Pattern = "^"
  18. If Left(m, 1) = ";" Then
  19.     Pattern = Pattern & "; *"
  20.     m = Right(m , Len(m) - 1)
  21. End If
  22. m = Split(m, "=")
  23. Pattern = Pattern & m(0) & " *= *" & m(1)
  24. Set oRegExp = CreateObject("VBScript.RegExp")
  25. oRegExp.Global = True
  26. oRegExp.MultiLine = True
  27. oRegExp.IgnoreCase = True
  28. oRegExp.Pattern = Pattern
  29. If oRegExp.Test(s) Then s = oRegExp.Replace(s, REPLACE_TEXT)
  30. oStream.Open()
  31. oStream.WriteText s
  32. oStream.SaveToFile OUT_FILE, 2
  33. oStream.Close()
复制代码
不知道5楼的powershell楼主为什么不用,win7、win10、win11都是自带powershell.exe的,很方便

这个是批处理调用cscript.exe,也是winxp、win7、win10、win11自带的命令
这里做了兼容性处理
SEARCH_TEXT指定为以下几行都可以得到同样的结果
; cgi.fix_pathinfo = 0
;  cgi.fix_pathinfo  =  0
;cgi.fix_pathinfo=0
cgi.fix_pathinfo = 0

QQ 20147578

TOP

可还行
if exist 是使用变量的值判断文件 , 不是判断变量本身 , 变量是变量 , 文件是文件
执行 set file=win12.iso 并不会拥有win12的iso文件了 , 只会拥有值为win12.iso的变量

还是不行不如直接用记事本打开 , 然后查找替换

TOP

回复 39# 77七


    打印了目录,确实发现,路径不对,解决了,谢谢

TOP

回复 41# czjt1234


    新年好,非常感谢回复,目前打算用bat方式解决,而且也不想依赖第三方东西,这样在各版本系统中,都可以直接使用。

   目前编写bat系统是Win11 等写好后打算去 Win7 上验证一下

TOP

回复 40# aloha20200628


    是的,本来想把样本和源码打包上传附件的,方便大家看到来龙去脉,结果发现上传失败,可能是我的等级低。

    在排查过程中也发现我的问题,也发现 if 里的 %%b 有时候会没有值,有时候又有值,

    不明所以为什么会空值,然后在if前输出%%b后,if又好了能正常判断输出了

    现在不知道调的是不是和延迟变量有关系,输出文本里 所有的叹号又没了

    另,还想问一下,如果有多个替换的值,增做方便些,我能想到就是多加几个if这样判断

    有没有类似python的字典方式的放 查找字符:替换字符?

TOP

返回列表