返回列表 发帖
回复  piazini

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


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

TOP

回复 37# 77七

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

TOP

回复 39# 77七


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

TOP

回复 41# czjt1234


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

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

TOP

回复 40# aloha20200628


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

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

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

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

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

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

TOP

回复 46# aloha20200628


    是的,我回顾整个过程,也单独运行你写的程序,和你说的效果一样。
    然后,我又反复查看,分析了一下。定位到了问题,在代码某个for循环里使用了延迟变量,用错了结束延迟语句,endlocal,
    正确的是 setlocal disabledelayedexpansion 而且,我还放错了地方,for 循环里有个if判断,满足会跳出,结果我放到跳出后关闭延迟变量,相当于没有关闭延迟变量。

TOP

  1. set "INPUT_FILE_529_dev=php.ini-dist"
  2. set "INPUT_FILE_541_dev=php.ini-development"
  3. set "PHP_INI_FILE=php.ini-development"
  4. if "%INPUT_FILE_529_dev%" == "%PHP_INI_FILE%" (
  5.         @REM 替换v5.2.9版 dev 的 php.ini-dist 文件内容
  6.         set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
  7.         set "REPLACE_TEXT=cgi.fix_pathinfo=1"
  8.         (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
  9.             if /i "%%b"=="%SEARCH_TEXT%" (echo,%SEARCH_TEXT% & echo,%REPLACE_TEXT%) else echo,%%b
  10.         ))>"%OUTPUT_FILE%"
  11. ) else if  "%INPUT_FILE_541_dev%" == "%PHP_INI_FILE%" (
  12.     @REM 替换v5.4.1版 dev 的 php.ini-development 文件内容
  13.     set "SEARCH_TEXT=;cgi.fix_pathinfo=1"
  14.     set "REPLACE_TEXT=cgi.fix_pathinfo=1"
  15.     (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
  16.         echo b=%%b
  17.         echo SEARCH_TEXT=%SEARCH_TEXT%
  18.         echo REPLACE_TEXT=%REPLACE_TEXT%
  19.         if /i "%%b"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%b
  20.     ))>"%OUTPUT_FILE%"
  21. )
复制代码
又遇到新问题,按照 set 设置变量,走的 else if 语句,但是打印 SEARCH_TEXT 变量值,确是 ; cgi.fix_pathinfo=0 (也就是 if 里变量值),难道同名变量不能覆盖?

TOP

回复 14# aloha20200628


    把14楼代码放到 if 里,执行就不成功了。
    双击执行时或直接在命令行打开 bat 时,第7行 echo %PHP_INI_FILE% 行提示 ECHO 处于关闭状态。正常应该是打印输出量值
    奇怪,为什么写到 if 里的语句和写在 if 外的结果不一样。
    包括 set /p 接受用户参数也一样,if 外 set /p 接受用户参数,直接用%%号包括变量就能echo输出,但是在 if 里,需要用延迟变量,用!!包裹才能显示。

    我写的如下:
  1. @echo off
  2. if ""=="" (
  3.     set "PHP_INI_FILE=php-5.2.9-Win32\php.ini-dist"
  4.     set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
  5.     set "REPLACE_TEXT=cgi.fix_pathinfo=1"
  6.     echo %PHP_INI_FILE%
  7.     echo "PHP_INI_FILE=%PHP_INI_FILE%"
  8.     echo "SEARCH_TEXT=%SEARCH_TEXT%"
  9.     echo "REPLACE_TEXT=%REPLACE_TEXT%"
  10.     (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
  11.         if /i "%%b"=="%SEARCH_TEXT%" (echo,%REPLACE_TEXT%) else echo,%%b
  12.     ))>"php-5.2.9-Win32\php.ini"
  13. )
  14. exit/b
复制代码

TOP

回复 50# aloha20200628


    嗯嗯,明白了,你说的延迟变量还没想到咋写。但是第二个明白了,就是把局部变量写道开头部分成全局变量。
    bat 写起来比 linux shell 的坑多太多了。

TOP

感谢大家的解答,脚本功能完成了。把我写的和大家帮助完成的功能,全部完整分享出来,方便更多人。

功能:
   自动解压php的zip 压缩包,并自动读取php模板文件,开启 CGI 和 ext 扩展目录
   要解压的php压缩包名,可以输入,也可以拖动 zip 到 bat脚本上,自动获取文件名和路径
使用环境:
   需要安装 winrar 或 7zip (需要其他压缩软件,请自己在源码里添加)
测试环境:
   Win11
   php 压缩包 v5.2.9 :https://museum.php.net/php5/php-5.2.9-Win32.zip
   php 压缩包 v5.4.1 : https://windows.php.net/downloads/releases/archives/php-5.4.1-Win32-VC9-x86.zip
   (选用这两个版本原因是,php.ini 模板文件名在5.4.1版本开始有了变化)

因为内容长度限制,也没 法上传附件,我把源码放到下面路径里,大家有兴趣自己看吧:
https://www.cnblogs.com/wutou/p/18695979

再次感谢大家的帮助,谢谢。

TOP

返回列表