«
按照phpstudy写pvm版本切换

时间:2025-11-4    作者:熊永生    分类: 其他


按照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