@echo off setlocal enabledelayedexpansion :: 定义基础变量 set "BUILD_DIR=build" set "OPM_ECTMS=opm_ectms" set "WEBMAN_BIN=webman.bin" @REM set "PHP_PATH=php" :: 默认值(系统环境变量中的 PHP) set "PHP_PATH=D:\AppData\sdk\php-8.4\php.exe" :: 默认值(系统环境变量中的 PHP) :: 关键修复:处理 PowerShell 传递的参数(自动清理引号、兼容特殊路径) if not "%~1"=="" ( :: 接收传入参数,自动去除 PowerShell 可能添加的单/双引号 set "INPUT_PHP=%~1" set "INPUT_PHP=!INPUT_PHP:'=!" :: 去除单引号 set "INPUT_PHP=!INPUT_PHP:"=!" :: 去除双引号 set "PHP_PATH=!INPUT_PHP!" :: 验证 PHP 路径是否存在(兼容带空格/特殊字符的路径) if not exist "!PHP_PATH!" ( echo ❌ 错误:传入的 PHP 路径不存在!实际路径:!PHP_PATH! pause exit /b 1 ) echo ℹ️ 已使用传入的 PHP 路径:!PHP_PATH! ) else ( echo ℹ️ 未传入 PHP 路径,使用系统默认 PHP(需添加到环境变量) ) :: 切换到脚本所在目录(兼容 PowerShell 中调用的路径问题) cd /d "%~dp0" 2>nul || ( echo ❌ 错误:无法切换到脚本所在目录,请检查脚本路径是否正确! pause exit /b 1 ) :: 检查并创建 build 文件夹 if not exist "%BUILD_DIR%" ( echo ⚠️ 未找到 build 目录,正在自动创建... md "%BUILD_DIR%" 2>nul || ( echo ❌ 错误:build 目录创建失败,请检查权限! pause exit /b 1 ) echo ✅ build 目录创建成功! ) :: 1. 清理旧文件 echo. echo 1 🧹 清理旧文件... if exist "%BUILD_DIR%\%WEBMAN_BIN%" ( del /f /q "%BUILD_DIR%\%WEBMAN_BIN%" 2>nul && ( echo ✅ 已删除旧的 %WEBMAN_BIN% 文件 ) || ( echo ⚠️ 警告:无法删除旧的 %WEBMAN_BIN% 文件(可能被占用) ) ) else ( echo ℹ️ 未找到旧的 %WEBMAN_BIN% 文件,无需清理 ) :: 2. 运行 PHP 构建命令(核心修复:用 call 确保 errorlevel 正确传递) echo. echo 2 🔧 执行构建命令:"!PHP_PATH!" -d phar.readonly=0 ./webman build:bin echo ℹ️ 当前使用的 PHP 路径:!PHP_PATH! call "!PHP_PATH!" -d phar.readonly=0 ./webman build:bin :: 关键修复:用更兼容的 errorlevel 判断方式(避免 PowerShell 解析冲突) if errorlevel 1 ( echo. echo ❌ 错误:PHP 构建命令执行失败! echo ℹ️ 可能原因: echo 1. PHP 路径不正确(当前路径:!PHP_PATH!) echo 2. PHP 未添加到系统环境变量(未传入路径时) echo 3. webman 脚本不存在或项目依赖缺失 echo 4. 缺少 phar 扩展或权限不足 pause exit /b 1 ) :: 检查构建结果 if not exist "%BUILD_DIR%\%WEBMAN_BIN%" ( echo. echo ❌ 错误:构建失败!未生成 %WEBMAN_BIN% 文件 pause exit /b 1 ) echo ✅ 构建成功,已生成 %WEBMAN_BIN% 文件 :: 3. 备份旧文件 echo. echo 3 🔧 备份旧的 %OPM_ECTMS% 文件... if exist "%BUILD_DIR%\%OPM_ECTMS%" ( :: 获取文件修改时间(兼容 PowerShell 中的日期格式) for /f "delims=" %%a in ('powershell -Command "(Get-Item -Path '%BUILD_DIR%\%OPM_ECTMS%' -ErrorAction SilentlyContinue).LastWriteTime.ToString('yyyyMMdd-HH')"') do ( set "FILE_MOD_TIME=%%a" ) :: 处理时间获取失败的情况 if "!FILE_MOD_TIME!"=="" set "FILE_MOD_TIME=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%" set "OLD_OPM_ECTMS=%OPM_ECTMS%.!FILE_MOD_TIME!" :: 避免备份文件重名 if exist "%BUILD_DIR%\!OLD_OPM_ECTMS!" set "OLD_OPM_ECTMS=!OLD_OPM_ECTMS!.bak" :: 执行备份(兼容带空格的文件名) ren "%BUILD_DIR%\%OPM_ECTMS%" "!OLD_OPM_ECTMS!" 2>nul && ( echo ✅ 旧文件已备份为:!OLD_OPM_ECTMS! ) || ( echo ⚠️ 警告:旧文件备份失败(可能被占用),将直接覆盖! ) ) else ( echo ℹ️ 未找到旧的 %OPM_ECTMS% 文件,无需备份 ) :: 4. 重命名文件 echo. echo 4 🔄 重命名文件:%WEBMAN_BIN% -> %OPM_ECTMS% ren "%BUILD_DIR%\%WEBMAN_BIN%" "%OPM_ECTMS%" 2>nul && ( echo ✅ 重命名成功! ) || ( echo ❌ 错误:重命名失败(目标文件可能被占用) pause exit /b 1 ) :: 5. 权限提示(Windows 环境) echo. echo 5 🔑 配置文件权限... echo ✅ Windows 环境下可执行权限已默认启用 echo ℹ️ 文件路径:%BUILD_DIR%\%OPM_ECTMS% :: 6. 计算 SHA256 哈希(兼容 PowerShell 中的文件路径) echo. echo 6 📊 计算 %OPM_ECTMS% 的 SHA256 哈希值... set "HASH_VALUE=" for /f "delims=" %%a in ('powershell -Command "(Get-FileHash -Path '%BUILD_DIR%\%OPM_ECTMS%' -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash"') do ( set "HASH_VALUE=%%a" ) if "!HASH_VALUE!"=="" ( echo ⚠️ 警告:哈希值计算失败(文件可能不存在或无权限) ) else ( echo ✅ 哈希值计算完成: echo SHA256: !HASH_VALUE! ) :: (可选)保存哈希值到文件 :: if "!HASH_VALUE!" neq "" ( :: echo !HASH_VALUE! > "%BUILD_DIR%\%OPM_ECTMS%.sha256" :: echo ℹ️ 哈希值已保存到:%BUILD_DIR%\%OPM_ECTMS%.sha256 :: ) :: 最终结果展示 echo. echo. echo ============================================== echo ✅ 所有操作已全部执行完毕! echo 📁 最终文件位置:%BUILD_DIR%\%OPM_ECTMS% echo 📊 文件 SHA256:!HASH_VALUE! echo 🖥️ 使用的 PHP 路径:!PHP_PATH! echo ============================================== pause