Windows批处理bat自动解压php的zip 压缩包,并自动读取php模板文件,开启 CGI 和 ext 扩展目录

前言全局说明


一、说明

1.1 环境:

Windows 11 家庭版 23H2 22631.3737

1.2 功能:

自动解压php的zip 压缩包,并自动读取php模板文件,开启 CGI 和 ext 扩展目录
要解压的php压缩包名,可以输入,也可以拖动 zip 到 bat脚本上,自动获取文件名和路径

1.3 使用环境:

需要安装 winrar 或 7zip (需要其他压缩软件,请自己在源码里添加)

1.4 测试环境:

Windows 11
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 模板文件名,v5.2.9用的是老的;在5.4.1版本开始用新的)


二、感谢

代码编写过程中遇到一些问题,感谢网友的解答。
http://www.bathome.net/viewthread.php?from=notice&tid=70471


三、自动解压php压缩包,并开启CGI和EXT

文件名:Win11_create-php-ini-cgi-find-relace-7zip.bat

@echo off
Chcp 65001 >nul
color 3e

echo.
echo   ####################################################################
echo.
echo           Windows 11 自动解压PHP压缩包,并开启CGI和ext扩展
echo.
echo                	   BY: www.wutou.net
echo.
echo                        2025-01-08
echo.
echo   ####################################################################
@REM echo. & echo.

@REM  功能: 
@REM    自动解压php压缩包,并开启配置cgi和ext插件扩展目录
@REM  Data: 
@REM    2025年1月08日 项目创建
@REM    2025年1月09日 
@REM    2025年1月10日 
@REM    2025年1月11日 设置解压命令
@REM    2025年1月16日 增加 用户选择 dev、protuct 
@REM                  判断 配置文件存在 
@REM                  获取 配置文件 
@REM    2025年1月29日 解决 5.2.9 版 dev 替换字符串 
@REM    2025年1月30日 修改 全局延迟变量改局部变量,防止影响到不需要延迟变量的地方 
@REM                  解决 使用错关闭延迟变量命令endlocal,\ 
@REM                  导致延迟变量影响到替换文本里!叹号被过滤 
@REM    2025年1月31日 修复 if 里set /p 变量获取不到用户输入,使用延迟变量 
@REM                  增加 解压绝对路径ZIP文件进入路径 cmd_cd_zip 
@REM                  增加 判断是终端命令行运行,还是双击运行 
@REM                  修复 包裹在if中的字符串替换值内容错误,else if 的同名变量是 if 里的值 \
@REM                  http://www.bathome.net/redirect.php?goto=findpost&ptid=70471&pid=287328 
@REM                  修改 搜索变量名 SEARCH_TEXT_xxx_541 -> SEARCH_TEXT_dev_xxx_CGI 方便多个替换时,区分功能
@REM                  修改 替换变量名 REPLACE_TEXT_xxx_529 -> REPLACE_TEXT_dev_xxx_CGI 方便多个替换时,区分功能
@REM                  增加 替换字符串 541_EXT 
@REM  


@REM 设置输入模板和输出文件  
set "INPUT_FILE_529_dev=php.ini-dist" 
set "INPUT_FILE_529_pro=php.ini-recommended" 
set "INPUT_FILE_541_dev=php.ini-development" 
set "INPUT_FILE_541_pro=php.ini-production" 
set "OUTPUT_FILE=php.ini" 
 
@REM 设置查找和替换的字符串 
@REM 新增替换步骤1:增加替换字符串变量 
@REM 变量值为 null 是该版本不需要替换此项,但不写为空时,后面if判断会将空行误判 
@REM dev 版字符串替换 
set "SEARCH_TEXT_dev_529_CGI=; cgi.fix_pathinfo=0"
set "REPLACE_TEXT_dev_529_CGI=cgi.fix_pathinfo=1"
set "SEARCH_TEXT_dev_529_EXT=null"
set "REPLACE_TEXT_dev_529_EXT=null"

set "SEARCH_TEXT_dev_541_CGI=;cgi.fix_pathinfo=1"
set "REPLACE_TEXT_dev_541_CGI=cgi.fix_pathinfo=1"
set "SEARCH_TEXT_dev_541_EXT=; extension_dir = ^"ext^""
set "REPLACE_TEXT_dev_541_EXT=extension_dir = ^"ext^""

@REM pro 版字符串替换
set "SEARCH_TEXT_pro_529_CGI=; cgi.fix_pathinfo=1"
set "REPLACE_TEXT_pro_529_CGI=cgi.fix_pathinfo=1"
set "SEARCH_TEXT_pro_529_EXT=null"
set "REPLACE_TEXT_pro_529_EXT=null"

set "SEARCH_TEXT_pro_541_CGI=;cgi.fix_pathinfo=1"
set "REPLACE_TEXT_pro_541_CGI=cgi.fix_pathinfo=1"
set "SEARCH_TEXT_pro_541_EXT=; extension_dir = ^"ext^""
set "REPLACE_TEXT_pro_541_EXT=extension_dir = ^"ext^""

@REM 当前环境
set START_DIR=%CD%
@REM echo %START_DIR%

@REM 获取拖动到bat上的文件名 @百度AI
set "file_PATH="
set "file_name="
set "file_suffix="
for %%i in (%*) do (
	set "file_PATH=%%~dpi"	
	set "file_name=%%~ni"	
	set "file_suffix=%%~xi"
)

@REM 用户选择 ini 配置文件类型
:MENU
echo. & echo. 
echo 1.开发版[development or dist] 
echo 2.生产版[production or recommended] 
echo. 
@REM 百度AI:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=1&tn=98012088_21_dg&wd=bat%E6%89%B9%E5%A4%84%E7%90%86%20%E6%8E%A5%E5%8F%97%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5&oq=bat%25E6%2589%25B9%25E5%25A4%2584%25E7%2590%2586%2520%25E6%258A%25A5%25E9%2594%2599go-pear.phar&rsv_pq=aadd0f5100060cd7&rsv_t=01b0lhW1j%2FwwJZOk0%2FeIm32ssjUd%2FtCCS9zG2gv12DTTuc1ZRNHlMSbBtVHqdQVvi2RkrE0&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=10066&rsv_sug3=65&rsv_sug1=37&rsv_sug7=100&rsv_sug2=0&rsv_sug4=10595 
set /p "userinput=[ INFO ] 请输入数字:" 
@REM echo.
if "%userinput%" == "1" (
    set ini_file_type=dev

) else if "%userinput%" == "2" (
    set ini_file_type=product

) else (
    cls & echo. & echo.
    echo [ Error ] 输入错误,请重新输入!!!
    echo. & echo.  & goto MENU 
)
@REM pause
@REM exit /b

@REM 双击运行bat打开时,提醒用户输入文件名 
if "%file_name%" == "" (
    @REM 注意:在if里获取用户输入需要开启延迟变量
    setlocal enabledelayedexpansion 
    set /p "userinput_PHP_ZIP_NAME=[ INFO ] 请输入 PHP 压缩包名: "
    @REM 判断文件是否存在
    if not exist "!userinput_PHP_ZIP_NAME!" (
        echo. & echo.
        echo [ Error ] 输入文件不存在,请检查:!userinput_PHP_ZIP_NAME!
        echo. & echo. & pause & exit /b
    )
    for /f "delims=" %%i in ('dir /s /b "!userinput_PHP_ZIP_NAME!" ') do ( 
        set "file_PATH=%%~dpi"	
        set "file_name=%%~ni"	
        set "file_suffix=%%~xi"
    )
    setlocal disabledelayedexpansion
    @REM endlocal
) 
@REM echo file_PATH=%file_PATH%
set "compress_out_file_dir=%file_name%"
set "get_file_name=%file_name%"
set "get_file_name_suffix=%file_PATH%%file_name%%file_suffix%"
@REM 判断文件是否存在
if not exist "%get_file_name_suffix%" (
    echo. & echo.
    echo [ Error ] 文件不存在,请检查:%get_file_name_suffix%
    echo. & echo. & pause & exit /b
)

echo [ OK ] 获取到文件路径: %file_PATH%
echo [ OK ] 获取到文件名: %file_name%
echo [ OK ] 获取到文件后缀: %file_suffix%

@REM 进入要解压的ZIP等压缩包路径
set "cmd_cd_zip=cd %file_PATH%"
echo [ CMD ] 进入ZIP等压缩包路径: %cmd_cd_zip% 
%cmd_cd_zip%

@REM 环境检查,检查系统中是否有7z或rar等压缩软件(使用第一个被找到的)
set "7ZIP=C:\Program Files\7-Zip\7z.exe"
set "7ZIP_Support_format_lists=.7z .bz2 .bzip2 .tbz2 .tbz .gz .gzip .tgz .tar .wim .swm .esd .xz .txz .zip .zipx .jar .xpi .odt .ods .docx .xlsx .epub .apfs .apm .ar .a .deb .lib .arj .b64 .cab .chm .chw .chi .chq .msi .msp .doc .xls .ppt .cpio .cramfs .dmg .ext .ext2 .ext3 .ext4 .img .fat .hfs .hfsx .hxs .hxi .hxr .hxq .hxw .lit .ihex .iso .lzh .lha .lzma .mbr .mslz .mub .nsis .ntfs .mbr .ra1 .r00 .rpm .ppmd .qcow .qcow2 .qcow2c .001 .002 .squashfs .udf .scap .uefif .vdi .vhd .vhdx .vmdk .xar .pkg .z .taz"
set "RAR=C:\Program Files (x86)\WinRAR\WinRAR.exe"
set "RAR_Support_format_lists=.zip .rar .7Z .ARJ .BZ2 .CAB .GZ .ISO .JAR .LZ .LZH .TAR .UUE .XZ .Z"
@REM 列表多个文件用;(封号)分割
set check_file_lists=7ZIP;RAR
set "compress_exe="
set "compress_exe_type="
@REM 之前为了获取变量的变量值,只用延迟变量获取了路径,现在为了获取解压软件类型和解压缩文件路径, 
@REM 将for拆开,未拆分的看 Win11_create-php-ini-cgi-find-relace-7zip.bat_bak_20250111-17_49 文件 
for %%c in (%check_file_lists%) do (
    @REM echo 类型:%%c
    setlocal enabledelayedexpansion 
    for %%d in ("!%%c!") do (
        @REM echo 路径:%%d
        if exist "%%d" (
            @REM 判断后缀是否是压缩软件支持的解压类型  
            @REM @百度AI https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=1&tn=98012088_21_dg&wd=%E6%89%B9%E5%A4%84%E7%90%86bat%20%E5%88%A4%E6%96%AD%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%85%E5%90%AB&oq=bat%2520%25E5%2588%25A4%25E6%2596%25AD%25E5%25AD%2597%25E7%25AC%25A6%25E4%25B8%25B2%25E5%258C%2585%25E5%2590%25AB&rsv_pq=cae9e3fa0004403e&rsv_t=2852LP6Da3TxU1WHuWmzq9%2F23CoLt0ufY7LBh3FRWLFLJT7eUt%2Fw5qH6MUYMclU76Ef2hWg&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=10&rsv_sug1=9&rsv_sug7=100&rsv_sug2=0&rsv_btype=t&inputT=3927&rsv_sug4=4912
            @REM echo %%d_Support_format_lists | findstr "%file_suffix%" >nul 2>&1
            echo !%%c_Support_format_lists! | findstr "%file_suffix%"  >nul 2>&1
            if errorlevel  0 (
                @REM 获取解压软件和解压软件类型名
                set "compress_exe=%%d"
                set "compress_exe_type=%%c" 
                setlocal disabledelayedexpansion
                @REM 使用找到解压软件并且支持解压后缀的解压程序,然后退出循环,不在继续查找
                goto check_compress_exe_PATH
            ) 
        ) 
    )
    endlocal
)

:check_compress_exe_PATH
if %compress_exe% == "" (
    echo. & echo.
    echo [ Error ] 未找到 7z 或 WinRAR 等压缩软件!!!
    echo. & echo. & pause & exit /b
)

echo.
echo [ INFO ] 解压软件:%compress_exe%
echo [ INFO ] 软件类型:%compress_exe_type%
echo.

@REM 判断使用哪个解压缩文件,设置解压命令 
@REM if /i表示不区分字符大小写
if /i "%compress_exe_type%" == "7ZIP" (
    set "cmd_jy=%compress_exe% x %get_file_name_suffix% -o%compress_out_file_dir%"
) else if /i "%compress_exe_type%" == "RAR" (
    set "cmd_jy=%compress_exe% x %get_file_name_suffix%  %compress_out_file_dir%"
) else (
    echo. & echo.
    echo [ Error ] 未找到 7z 或 WinRAR 等压缩软件!!!
    echo. & echo. & pause & exit /b
)


@REM 解压文件
echo [ INFO ] 开始解压...
@REM "C:\Program Files\7-Zip\7z" x php-5.3.8-Win32-VC9-x86.zip -o{文件夹名}
@REM 执行解压方式 一
@REM echo [ CMD ] !compress_exe! x %get_file_name_suffix% -o!file_PATH!%compress_out_file_dir%
@REM !compress_exe! x %get_file_name_suffix% -o!file_PATH!%compress_out_file_dir%

@REM 执行解压方式 二
@REM set "cmd_jy=!compress_exe! x %get_file_name_suffix% -o%compress_out_file_dir%"
echo [ CMD ] %cmd_jy% 
%cmd_jy%

@REM endlocal
set "cmd_cd=cd %compress_out_file_dir%\" 
@REM set "cmd_cd=cd !compress_out_file_dir!\" 
if exist "%compress_out_file_dir%" (
    echo [ INFO ] 解压完成. 
    echo.
    echo [ INFO ] 进入目录:%compress_out_file_dir%\ 

    @REM set "cmd_cd=cd%compress_out_file_dir%" BUG:变量在这里设置 下面 %cmd_cd% 获取不到,设置到if外才行
    echo [ CMD ] %cmd_cd%  
    %cmd_cd%
) else (
    echo. & echo.
    echo [ INFO ] 当前路径是: %CD%
    echo [ Error ] 没有找到 %compress_out_file_dir%\ 文件夹,解压失败!!!
    echo. & echo. & pause & exit /b
)
echo.

@REM 获取配置文件
@REM 新增替换步骤2: 增加替换dev和pro版字符串,共用变量,不要和已有变量名重复即可
set PHP_INI_FILE=
if "%ini_file_type%" == "dev" (
    echo [ INFO ] 当前dev路径是: %CD%
    if exist "%INPUT_FILE_529_dev%" (
        set PHP_INI_FILE=%INPUT_FILE_529_dev%
        set SEARCH_TEXT_CGI=%SEARCH_TEXT_dev_529_CGI%
        set REPLACE_TEXT_CGI=%REPLACE_TEXT_dev_529_CGI%
        set SEARCH_TEXT_EXT=%SEARCH_TEXT_dev_529_EXT%
        set REPLACE_TEXT_EXT=%REPLACE_TEXT_dev_529_EXT%
    ) else if exist "%INPUT_FILE_541_dev%" (
        set PHP_INI_FILE=%INPUT_FILE_541_dev%
        set SEARCH_TEXT_CGI=%SEARCH_TEXT_dev_541_CGI%
        set REPLACE_TEXT_CGI=%REPLACE_TEXT_dev_541_CGI%
        set SEARCH_TEXT_EXT=%SEARCH_TEXT_dev_541_EXT%
        set REPLACE_TEXT_EXT=%REPLACE_TEXT_dev_541_EXT%
    ) else (
        echo. & echo.
        echo [ INFO ] INPUT_FILE_529_dev=%INPUT_FILE_529_dev% 
        echo [ INFO ] INPUT_FILE_541_dev=%INPUT_FILE_541_dev% 
        echo [ INFO ] PHP_INI_FILE=%PHP_INI_FILE%
        echo [ Error ] 没有匹配的 dev 版 ini 配置文件 !!! 
        echo. & echo. & pause & exit /b
    )
) else if "%ini_file_type%" == "product" (
    echo [ INFO ] 当前product路径是: %CD%
    if exist "%INPUT_FILE_529_pro%" ( 
        set PHP_INI_FILE=%INPUT_FILE_529_pro% 
        set SEARCH_TEXT_CGI=%SEARCH_TEXT_pro_529_CGI%
        set REPLACE_TEXT_CGI=%REPLACE_TEXT_pro_529_CGI%
        set SEARCH_TEXT_EXT=%SEARCH_TEXT_pro_529_EXT%
        set REPLACE_TEXT_EXT=%REPLACE_TEXT_pro_529_EXT%
    ) else if exist "%INPUT_FILE_541_pro%" ( 
        set PHP_INI_FILE=%INPUT_FILE_541_pro% 
        set SEARCH_TEXT_CGI=%SEARCH_TEXT_pro_541_CGI%
        set REPLACE_TEXT_CGI=%REPLACE_TEXT_pro_541_CGI%
        set SEARCH_TEXT_EXT=%SEARCH_TEXT_pro_541_EXT%
        set REPLACE_TEXT_EXT=%REPLACE_TEXT_pro_541_EXT%
    ) else ( 
        echo. & echo. 
        echo [ INFO ] INPUT_FILE_529_pro=%INPUT_FILE_529_pro% 
        echo [ INFO ] INPUT_FILE_541_pro=%INPUT_FILE_541_pro% 
        echo [ INFO ] PHP_INI_FILE=%PHP_INI_FILE%
        echo [ Error ] 没有匹配的 product 版 ini 配置文件!!!  
        echo. & echo. & pause & exit /b 
    ) 
) else ( 
    echo. & echo. 
    echo [ Error ] 目录下没有 ini 配置文件!!! 
    echo. & echo. & pause & exit /b 
)
@REM echo.
echo [ INFO ] 找到到配置文件模板:%PHP_INI_FILE% 

@REM 删除旧 php.ini 文件
set cmd_del=del %OUTPUT_FILE% 
if exist %OUTPUT_FILE% (
    echo [ CMD ] 删除之前生成的文件:%cmd_del% 
    %cmd_del% >nul 
)
echo. 

@REM @百度AI https://www.baidu.com/s?ie=UTF-8&wd=bat%E6%9F%A5%E8%AF%A2%E6%9B%BF%E6%8D%A2%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9&tn=98012088_21_dg&ch=1
@REM 读取输入文件,进行替换,输出到输出文件 
echo [ INFO ] 开始遍历读取 %PHP_INI_FILE% 模板文件,替换内容,生成 %OUTPUT_FILE% 文件...
(for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
    @REM 新增替换步骤3: 增加 字符串判断 
    echo,%%b
    if /i "%%b"=="%SEARCH_TEXT_CGI%" (echo,%REPLACE_TEXT_CGI%)
    if /i "%%b"=="%SEARCH_TEXT_EXT%" (echo,%REPLACE_TEXT_EXT%)
))>"%OUTPUT_FILE%" 

if exist "%OUTPUT_FILE%" ( 
    @REM echo. & echo. 
    echo [ OK ] 生成 %OUTPUT_FILE% 文件,成功.
    @REM echo. & echo. & pause & exit /b 
) else ( 
    echo. & echo. 
    echo [ Error ] 生成 %OUTPUT_FILE% 文件,失败!!!  
    @REM echo. & echo. & pause & exit /b 
) 
echo. 

echo [ INFO ] 返回目录:%START_DIR%
cd %START_DIR%
 
@REM 判断是终端命令行运行,还是双击运行
echo %CMDCMDLINE% | find "/c" >nul
if %errorlevel% equ 0  (
	echo. & echo. & pause & exit /b 
) else (
	echo.
	@REM echo [ INFO ] 脚本 %~nx0 在命令行下运行
)



免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。




参考、来源:



posted @ 2025-01-31 21:30  悟透  阅读(77)  评论(0)    收藏  举报