alerts_bot/portable_install.bat
Евгений Панков 2bfa13b023 Alert первый комит
Основной функционал:
* Портативная среда выполнения на виндовс
* Пересылка сообщений из публичного канала по ключевым словам
* Отслеживание изменений пересланных сообщений
* Очистка от системных
2025-07-10 20:49:41 +03:00

221 lines
8.1 KiB
Batchfile

@echo off
chcp 65001 >nul
cd /d "%~dp0%"
setlocal enabledelayedexpansion
REM Установка переменных
set home_dir=%~dp0%
set python_dir=python312
set python_url=https://www.python.org/ftp/python/3.12.10/python-3.12.10-embed-amd64.zip
:start
REM Проверяем, установлен ли уже 7za.exe
if exist "%python_dir%\7za.exe" (move /y %python_dir%\7za.exe 7za.exe) >nul
if exist 7za.exe (
echo [ ] 7zip уже скачан: Использую локальную версию
) else (
echo [*] Скачивание 7zip
certutil.exe -urlcache -split -f "https://www.7-zip.org/a/7zr.exe" 7zr.exe >nul
certutil.exe -urlcache -split -f "https://www.7-zip.org/a/7z2500-extra.7z" 7z2500-extra.7z >nul
7zr.exe x 7z2500-extra.7z 7za.exe -y >nul
del 7zr.exe
del 7z2500-extra.7z
)
if exist "%python_dir%/python.exe" (
for /f "tokens=2" %%V in ('cmd /c ^""%python_dir%\python.exe" --version^"') do set "python_version=%%V"
echo [ ] Python уже скачан: Использую локальную версию !python_version!
) else (
echo [*] Скачивание Python
certutil.exe -urlcache -split -f "https://www.python.org/ftp/python/3.12.10/python-3.12.10-embed-amd64.zip" python.zip >nul
7za.exe x python.zip -o"%python_dir%" >nul
for /f "tokens=2" %%V in ('cmd /c ^""%python_dir%\python.exe" --version^"') do set "python_version=%%V"
for /f "tokens=1,2 delims=." %%a in ("!python_version!") do set "python_short_version=python%%a%%b"
echo [*] Скачан Python !python_version!
del python.zip
echo [*] Установка pip
cd "%python_dir%"
certutil.exe -urlcache -split -f "https://bootstrap.pypa.io/get-pip.py" get-pip.py >nul
python.exe get-pip.py --no-warn-script-location
del get-pip.py
echo [*] Изменение !python_short_version!._pth
echo Lib>> !python_short_version!._pth
echo Lib\site-packages>> !python_short_version!._pth
echo import site>> !python_short_version!._pth
python.exe -m pip install --upgrade pip setuptools wheel --no-cache-dir --no-warn-script-location
cd ..
if exist "requirements.txt" (
%python_dir%\python.exe -m pip install -r requirements.txt --no-cache-dir --no-warn-script-location
)
)
:venv_setup
set update=False
set no_changes=False
if exist "%python_dir%\Scripts\activate.bat" (
if exist "%python_dir%\pyvenv.cfg" (
echo [ ] Виртуальное окружение уже сконфигурировано\
for /f "tokens=2 delims==" %%H in ('findstr /r "^base-executable[ ]*=" "%python_dir%\pyvenv.cfg"') do (set "installed_home=%%H")
rem Удаляем пробелы и кавычки по краям
for /f "tokens=* delims= " %%B in ("!installed_home!") do (set "installed_home=%%B")
set "installed_home=!installed_home:"=!"
rem Выводим для отладки
echo Текущий путь в pyvenv.cfg: !installed_home!
echo Ожидаемый путь: %home_dir%%python_dir%\python.exe
rem Сравниваем пути
if /i "!installed_home!"=="%home_dir%%python_dir%\python.exe" (
echo Конфигурация верная. Обновление не требуется
set no_changes=True
goto skip_venv
) else (
echo Путь портативной устаноки изменился.
set /p "update=Требуется обновление. Обновить? [Y/Д] нет по умолчанию: "
if /i "!update!"=="Y" (
set update=True
echo Обновляем...
) else (
if /i "!update!"=="Д" (
set update=True
echo Обновляем...
goto venv_config
)
echo Пропускаем обновление.
goto skip_venv
)
)
))
:venv_config
echo [*] Конфигурация виртуального окружения
if exist %python_dir%\Lib\site-packages\sitecustomize.py (
echo [ ] Lib\site-packages\sitecustomize.py существует и не требует обновления
goto skip_sitecustomize
) else (
echo [*] Создание sitecustomize.py для исправления site.getsitepackages и sys.prefix
)
(
echo import site
echo import os
echo import sys
echo project_root = os.path.abspath^(os.path.join^(os.getenv^('VIRTUAL_ENV'^), '..'^)^)
echo if project_root in sys.path:
echo sys.path.remove^(project_root^)
echo sys.prefix = os.getenv^('VIRTUAL_ENV'^)
echo sys.exec_prefix = os.getenv^('VIRTUAL_ENV'^)
echo def getsitepackages^(^):
echo return [os.path.join^(os.getenv^('VIRTUAL_ENV'^), 'Lib', 'site-packages'^)]
echo site.getsitepackages = getsitepackages
) > "%python_dir%\Lib\site-packages\sitecustomize.py"
:skip_sitecustomize
echo [*] Создание %python_dir%\pyvenv.cfg
(
echo home = %home_dir%%python_dir%
echo implementation = CPython
echo version_info = %python_version%
echo virtualenv = 20.31.2
echo include-system-site-packages = false
echo base-prefix = %home_dir%%python_dir%
echo base-exec-prefix = %home_dir%%python_dir%
echo base-executable = %home_dir%%python_dir%\python.exe
) > "%python_dir%\pyvenv.cfg"
echo [*] Создание %python_dir%\Scripts\activate.bat
(
echo @echo off
echo REM This file is UTF-8 encoded, so we need to update the current code page while executing it
echo chcp 65001 ^> nul
echo set "VIRTUAL_ENV=%home_dir%%python_dir%"
echo set "VIRTUAL_ENV_PROMPT=%python_dir%"
echo if defined _OLD_VIRTUAL_PROMPT ^(
echo set "PROMPT=%%_OLD_VIRTUAL_PROMPT%%"
echo ^) else ^(
echo if not defined PROMPT ^(
echo set "PROMPT=$P$G"
echo ^)
echo if not defined VIRTUAL_ENV_DISABLE_PROMPT ^(
echo set "_OLD_VIRTUAL_PROMPT=%%PROMPT%%"
echo ^)
echo ^)
echo if not defined VIRTUAL_ENV_DISABLE_PROMPT ^(
echo set "PROMPT=(%%VIRTUAL_ENV_PROMPT%%) %%PROMPT%%"
echo ^)
echo if defined _OLD_VIRTUAL_PYTHONHOME ^(
echo set "PYTHONHOME=%%_OLD_VIRTUAL_PYTHONHOME%%"
echo ^) else ^(
echo set "_OLD_VIRTUAL_PYTHONHOME=%%PYTHONHOME%%"
echo ^)
echo set "PYTHONHOME="
echo if defined _OLD_VIRTUAL_PATH ^(
echo set "PATH=%%_OLD_VIRTUAL_PATH%%"
echo ^) else ^(
echo set "_OLD_VIRTUAL_PATH=%%PATH%%"
echo ^)
echo set "PATH=%%VIRTUAL_ENV%%;%%VIRTUAL_ENV%%\Scripts;%%PATH%%"
echo set "PYTHONPATH=%%VIRTUAL_ENV%%\Lib\site-packages"
echo chcp %%_OLD_CODEPAGE%% ^> nul
) > %python_dir%\Scripts\activate.bat
:skip_venv
call %python_dir%\Scripts\activate.bat
if exist run_me.bat (
echo [ ] run_me.bat существует, не требует обновления
goto skip_run_me
)
echo [+] Создание run_me.bat
(
echo cd /d "%%~dp0%%"
echo call %python_dir%\Scripts\activate.bat
echo call python main.py
echo pause
) > run_me.bat
:skip_run_me
REM Храним 7zip внутри папки Python
if exist 7za.exe (move /y 7za.exe %python_dir%\7za.exe )>nul
if %no_changes%==True (
set /p "reinstall=Изменений не внесено. Желаете переустановить? [Y/Д] нет по умолчанию: "
if /i "!reinstall!"=="Y" (
goto clear_installation
) else (
if /i "!reinstall!"=="Д" (goto clear_installation)
)
goto end
) else (
echo [✔️] Установка завершена
pause
goto end
)
:clear_installation
set /p "reinstall_python=Скачать Python и пакеты заново? [Y/Д] нет по умолчанию: "
if /i "!reinstall_python!"=="Y" (
goto del_all_python
) else (
if /i "!reinstall_python!"=="Д" (goto del_all_python)
)
goto del_only_settings
:del_all_python
if exist "%python_dir%\7za.exe" (move /y %python_dir%\7za.exe 7za.exe) >nul
move /y %python_dir%\7za.exe 7za.exe>nul
echo [-] Удаление Python
rmdir /s /q %python_dir%
goto start
:del_only_settings
echo [-] Удаление настроек окружения
del "%python_dir%\Lib\site-packages\sitecustomize.py"
del "%python_dir%\pyvenv.cfg"
del "%python_dir%\Scripts\activate.bat"
del run_me.bat
goto venv_setup
:end