按照phpstudy写pvm版本切换
F:\work\phpstudy_pro\Extensions\php 这是phpstudy的php目录
环境变量
D:\Program Files\cmd 当前脚本
F:\work\phpstudy_pro\Extensions\php\current_php 访问的php目录
F:\work\phpstudy_pro\Extensions\composer2.5.8 访问的composer目录
pvm.bat
@echo off
chcp 936 >nul 2>&1
cls
setlocal enabledelayedexpansion
:: ====== 配置区(按需修改) ======
set "PHP_ROOT=F:\work\phpstudy_pro\Extensions\php"
set "CURRENT=%PHP_ROOT%\current_php"
:: ==================================
echo ================================
echo PHP 版本切换(先删除再复制)
echo ================================
echo.
:: 1. 列出版本
set /a count=0
for /d %%d in ("%PHP_ROOT%\php*") do (
if exist "%%d\php.exe" (
set /a count+=1
set "ver[!count!]=%%~nxd"
set "path[!count!]=%%~fd"
echo !count!. %%~nxd
)
)
if %count% equ 0 (
echo 未找到 PHP 版本,请检查 %PHP_ROOT%
pause
exit /b 1
)
echo.
set /p "choice=请输入要切换的版本编号 (1-%count%): "
:: 去掉 choice 前后空白
for /f "tokens=* delims= " %%# in ("%choice%") do set "choice=%%#"
:: 验证输入是否为空
if "%choice%"=="" (
echo 未输入编号,退出
pause
exit /b 1
)
:: 检查是否含有非数字字符
set "notnum="
for /f "delims=0123456789" %%A in ("%choice%") do set "notnum=%%A"
if defined notnum (
echo 输入不是纯数字,退出
pause
exit /b 1
)
:: 数值范围检查
if %choice% LSS 1 (
echo 编号小于 1,退出
pause
exit /b 1
)
if %choice% GTR %count% (
echo 编号超出范围,退出
pause
exit /b 1
)
:: 读取选择的版本路径
set "SRC=!path[%choice%]!"
set "VERNAME=!ver[%choice%]!"
echo.
echo 你选择: !VERNAME!
echo 源路径: !SRC!
echo 目标路径: %CURRENT%
echo.
:: 2. 检查 php.exe 是否被占用(避免删除/复制失败)
tasklist /FI "IMAGENAME eq php.exe" | find /I "php.exe" >nul
if %ERRORLEVEL%==0 (
echo 检测到正在运行的 php.exe 进程,可能导致删除/复制失败。
echo 建议先停止相关服务/程序(如 phpStudy、IDE 内置服务器等)。
set /p "kill=是否尝试结束所有 php.exe 进程并继续?(y/N): "
if /i "%kill%"=="y" (
echo 正在结束 php.exe 进程...
for /f "tokens=2" %%p in ('tasklist /FI "IMAGENAME eq php.exe" /NH') do (
taskkill /PID %%p /F >nul 2>&1
)
timeout /t 1 >nul
) else (
echo 请停止相关进程后重新运行脚本。
pause
exit /b 1
)
)
:: 3. 先删除 current_php 目录(彻底清空)
echo 正在删除旧的 %CURRENT% 目录及文件...
if exist "%CURRENT%" (
rd /s /q "%CURRENT%" >nul 2>&1
:: 检查删除是否成功
if exist "%CURRENT%" (
echo 删除失败!可能有文件被锁定或权限不足。
pause
exit /b 1
)
)
:: 4. 重新创建 current_php 目录并复制新内容
echo 正在创建新的 %CURRENT% 目录...
mkdir "%CURRENT%" >nul 2>&1
echo 正在复制 "!SRC!" 到 "%CURRENT%"...
:: 使用 /E 复制所有子目录(包括空目录),替代原有的 /MIR(因已先删除目标)
robocopy "!SRC!" "%CURRENT%" /E /R:2 /W:1 /NFL /NDL /NP
if %ERRORLEVEL% GEQ 8 (
echo 复制失败(ExitCode=%ERRORLEVEL%),可能因权限或文件占用。
pause
exit /b 1
)
echo.
echo ===========================
echo 版本切换完成
echo ===========================
echo 当前PHP版本验证:
"%CURRENT%\php.exe" -v
echo.
pause
endlocal
exit /b 0