@echo off setlocal EnableExtensions EnableDelayedExpansion title DMF Crawler Install cd /d "%~dp0" set "ROOT=%~dp0" if "%ROOT:~-1%"=="\" set "ROOT=%ROOT:~0,-1%" set "VENV=%ROOT%\.venv" set "VPY=%VENV%\Scripts\python.exe" set "VPYW=%VENV%\Scripts\pythonw.exe" set "LOGDIR=%ROOT%\logs" if not exist "%LOGDIR%" mkdir "%LOGDIR%" >nul 2>&1 set "LOG=%LOGDIR%\bootstrap.log" echo ================================================ echo DMF Crawler First-Time Setup echo ================================================ echo. echo This window closes itself when setup finishes. echo It appears only once. echo. rem =================================================================== rem [1/5] Find Python rem Note: python.exe on PATH does not always mean Python is installed. rem The Microsoft Store app-execution-alias stub is always on rem PATH and returns an error code when run with arguments rem (per Microsoft's own FAQ). So the py launcher is tried first; rem the Store stub ships without py. rem =================================================================== echo [1/5] Looking for Python... set "PYEXE=" rem -- if a venv already exists, reuse it (fast path on re-run) if exist "%VPY%" ( "%VPY%" -c "import sys;raise SystemExit(0 if sys.version_info>=(3,11) else 1)" >nul 2>&1 if !errorlevel! equ 0 ( set "PYEXE=%VPY%" echo Using existing environment. goto :have_python ) ) rem -- 1st choice: py launcher where py.exe >nul 2>&1 if !errorlevel! equ 0 ( for %%V in (3.13 3.12 3.11) do ( if not defined PYEXE ( py -%%V -c "import sys" >nul 2>&1 if !errorlevel! equ 0 ( for /f "delims=" %%P in ('py -%%V -c "import sys;print(sys.executable)" 2^>nul') do set "PYEXE=%%P" ) ) ) if not defined PYEXE ( py -3 -c "import sys;raise SystemExit(0 if sys.version_info>=(3,11) else 1)" >nul 2>&1 if !errorlevel! equ 0 ( for /f "delims=" %%P in ('py -3 -c "import sys;print(sys.executable)" 2^>nul') do set "PYEXE=%%P" ) ) ) rem -- 2nd choice: python.exe on PATH (confirm it actually runs, not a stub) if not defined PYEXE ( python -c "import sys;raise SystemExit(0 if sys.version_info>=(3,11) else 1)" >nul 2>&1 if !errorlevel! equ 0 ( for /f "delims=" %%P in ('python -c "import sys;print(sys.executable)" 2^>nul') do set "PYEXE=%%P" ) ) rem -- 3rd choice: search well-known install paths directly if not defined PYEXE ( for %%D in ( "%LOCALAPPDATA%\Programs\Python\Python313" "%LOCALAPPDATA%\Programs\Python\Python312" "%LOCALAPPDATA%\Programs\Python\Python311" "C:\Python313" "C:\Python312" "C:\Python311" ) do ( if not defined PYEXE if exist "%%~D\python.exe" set "PYEXE=%%~D\python.exe" ) ) if defined PYEXE goto :have_python rem =================================================================== rem No Python found -> ask whether to install it rem =================================================================== echo Not installed. echo. echo Install Python now? ^(about 2-5 minutes^) echo Administrator rights are not required. echo. choice /c YN /n /m " [Y] Yes, install it [N] No, I will install it myself Choice: " if errorlevel 2 goto :manual_python echo. echo Installing Python. Do not close this window... where winget.exe >nul 2>&1 if !errorlevel! neq 0 goto :manual_python winget install --id Python.Python.3.12 --scope user --silent ^ --accept-package-agreements --accept-source-agreements >>"%LOG%" 2>&1 rem -- this window's PATH is not refreshed right after install. Search directly. for %%D in ( "%LOCALAPPDATA%\Programs\Python\Python313" "%LOCALAPPDATA%\Programs\Python\Python312" "%LOCALAPPDATA%\Programs\Python\Python311" ) do ( if not defined PYEXE if exist "%%~D\python.exe" set "PYEXE=%%~D\python.exe" ) if not defined PYEXE ( where py.exe >nul 2>&1 if !errorlevel! equ 0 ( for /f "delims=" %%P in ('py -3 -c "import sys;print(sys.executable)" 2^>nul') do set "PYEXE=%%P" ) ) if not defined PYEXE goto :manual_python echo Installed. :have_python echo Found: %PYEXE% echo. rem =================================================================== rem [2/5] Virtual environment + dependencies rem =================================================================== echo [2/5] Preparing the runtime environment... ^(30 sec - 2 min^) if not exist "%VPY%" ( "%PYEXE%" -m venv "%VENV%" >>"%LOG%" 2>&1 if !errorlevel! neq 0 goto :fail_venv ) "%VPY%" -m pip install --upgrade pip --disable-pip-version-check -q >>"%LOG%" 2>&1 "%VPY%" -m pip install -e "%ROOT%" --disable-pip-version-check -q >>"%LOG%" 2>&1 if !errorlevel! neq 0 goto :fail_deps echo Done echo. rem =================================================================== rem [3/5] Remove Mark-of-the-Web rem Files extracted from a downloaded ZIP get a Zone.Identifier stream, rem which can block .ps1 execution. This is the same action as the rem [Unblock] checkbox in a file's Properties dialog. rem =================================================================== echo [3/5] Unblocking files... powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass ^ -Command "Get-ChildItem -LiteralPath '%ROOT%' -Recurse -File -ErrorAction SilentlyContinue | Unblock-File -ErrorAction SilentlyContinue" >>"%LOG%" 2>&1 echo Done echo. rem =================================================================== rem [4/5] Shortcuts rem =================================================================== echo [4/5] Creating desktop shortcuts... powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass ^ -File "%ROOT%\scripts\make_shortcuts.ps1" -ProjectRoot "%ROOT%" >>"%LOG%" 2>&1 if !errorlevel! neq 0 ( echo Skipped ^(the program still works without shortcuts^) ) else ( echo Done ) echo. rem =================================================================== rem [5/5] Launch the onboarding GUI rem pythonw.exe does not create a console. Launch it with start "" and rem close this window. rem =================================================================== echo [5/5] Opening the setup window... echo. echo Setup finished. The setup window will open in a moment. start "" "%VPYW%" -m dmf_crawler onboard --mode setup timeout /t 3 /nobreak >nul exit /b 0 rem =================================================================== rem Failure paths - always tell the user what to do next rem =================================================================== :manual_python echo. echo ------------------------------------------------ echo Please install Python yourself echo ------------------------------------------------ echo. echo 1. Open this address in your browser. echo https://www.python.org/downloads/ echo 2. Click [Download Python 3.12.x] to get the installer. echo 3. Near the bottom of the installer screen, echo check the box [Add python.exe to PATH] echo 4. When installation finishes, close this window and run echo bootstrap.cmd again. echo. choice /c YN /n /m " Open the download page now? [Y/N]: " if not errorlevel 2 start "" "https://www.python.org/downloads/" echo. pause exit /b 1 :fail_venv echo. echo [Error] Could not create the runtime environment. echo. echo Please check the following. echo - Whether this folder allows creating files echo ^(if it is under C:\Program Files, move it to Documents^) echo - Whether antivirus software is blocking it echo. echo Details: %LOG% echo. pause exit /b 1 :fail_deps echo. echo [Error] Could not download the required components. echo. echo Please check the following. echo - Whether this computer is connected to the internet echo - Whether a company firewall blocks pypi.org echo ^(ask IT to allow pypi.org and files.pythonhosted.org^) echo. echo Details: %LOG% echo. pause exit /b 1