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 @   悟透  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2024-01-31 Windows Powershell 执行结束 返回状态码
2024-01-31 PowerShell 基本语法
2024-01-31 Powershell 命令行快捷键
2024-01-31 PowerShell param、args接收用户输入参数
点击右上角即可分享
微信分享提示