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


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

TOP

回复 37# 77七

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

TOP

回复 35# piazini


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

TOP

回复  piazini

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


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

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

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

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

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

回复 29# Five66


    新年好,去掉了也没成功,奇怪了

TOP

啊,楼主1楼例子的内容=号两边有空格
但是php.ini-dist里的=号两边是没有空格的
将19代码SEARCH_TEXT和REPLACE_TEXT =号两边的空格去掉 , 然后试试

TOP

回复 23# Five66


    新年好,感谢感谢

TOP

回复 25# 77七
新年好
这个配置文件里,去掉配置前的;封号就是开启某个设置值。
我希望的是保留源格式的情况下,去掉前面的封号或在后面插入对应的值。
但是目前还是没达到我想要的效果
不排除后期有多个值要去掉封号,但是目前连一个值前去掉封号都没成功。

TOP

回复 24# aloha20200628


    新年快乐
    测试了一下,部分行中间的谈行被保留了,但是行尾的叹号还是被去掉了,如:113、193、316、401、772、807行都被去掉了。
    关键是我的还没替换成功
  1. set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
  2.         set "REPLACE_TEXT=cgi.fix_pathinfo=1"
  3.         (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
  4.             if /i "%%b"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%b
  5.         ))>>"%OUTPUT_FILE%"
复制代码

TOP

本帖最后由 77七 于 2025-1-27 16:37 编辑

楼主应该不单单只替换某一个,而是一些吧?从楼主提供的文件中选取了写代码需要注意的行,还需要明确等号前后的空格需要保留原文本的格式,还是替换成新的固定格式?
  1. [PHP]
  2. ;;;;;;;;;;;
  3. ; Directive names are *case sensitive* - foo=bar is different from FOO=bar.
  4. ;
  5. ; |        bitwise OR
  6. ; &        bitwise AND
  7. ; !        boolean NOT
  8. engine = On
  9. ; Allow the <? tag.  Otherwise, only <?php and <script> tags are recognized.
  10. precision    =  12
  11. ;output_handler =
  12. zlib.output_compression = Off
  13. ; *NOT* affected by whether Safe Mode is turned On or Off.
  14. ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
  15. ; cgi.fix_pathinfo=0
  16. ;fbsql.default_user = "_SYSTEM"
  17. soap.wsdl_cache_dir="/tmp"
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表