diff --git a/gibMacOS.bat b/gibMacOS.bat index 811ce95..2631fb1 100644 --- a/gibMacOS.bat +++ b/gibMacOS.bat @@ -6,6 +6,17 @@ set "script_name=%~n0.command" set "thisDir=%~dp0" set /a tried=0 set "toask=yes" +set "py2v=" +set "py2path=" +set "py3v=" +set "py3path=" +set "pypath=" + +REM use_py3: +REM TRUE = Use if found, use py2 otherwise +REM FALSE = Use py2 +REM FORCE = Use py3 +set "use_py3=TRUE" goto checkscript @@ -23,8 +34,22 @@ if not exist "!thisDir!\!script_name!" ( goto checkpy :checkpy -python -V > NUL 2>&1 -if not "!errorlevel!" == "0" ( +for /f "tokens=1" %%x in ('where python') do ( call :checkpyversion "%%x" "py2v" "py2path" "py3v" "py3path" ) +set "targetpy=3" +if /i "!use_py3!" == "FALSE" ( + set "targetpy=2" + set "pypath=!py2path!" +) else if /i "!use_py3!" == "FORCE" ( + set "pypath=!py3path!" +) else if /i "!use_py3!" == "TRUE" ( + set "pypath=!py3path!" + if "!pypath!" == "" set "pypath=!py2path!" +) +if not "!pypath!" == "" ( + goto runscript +) + +if "!pypath!" == "" ( if %tried% lss 1 ( if /i "!toask!"=="yes" ( REM Better ask permission first @@ -37,6 +62,7 @@ if not "!errorlevel!" == "0" ( echo ### ### echo # Warning # echo ### ### + echo. REM Couldn't install for whatever reason - give the error message echo Python is not installed or not found in your PATH var. echo Please install it from https://www.python.org/downloads/windows/ @@ -54,13 +80,69 @@ if not "!errorlevel!" == "0" ( ) goto runscript +:checkpyversion +set "version="&for /f "tokens=2* USEBACKQ delims= " %%a in (`"%~1" -V 2^>^&1`) do ( + REM Ensure we have a version number + call :isnumber "%%a" + if not "!errorlevel!" == "0" goto :EOF + set "version=%%a" +) +if not defined version goto :EOF +if "!version:~0,1!" == "2" ( + REM Python 2 + call :comparepyversion "!version!" "!%~2!" + if "!errorlevel!" == "1" ( + set "%~2=!version!" + set "%~3=%~1" + ) +) else ( + REM Python 3 + call :comparepyversion "!version!" "!%~4!" + if "!errorlevel!" == "1" ( + set "%~4=!version!" + set "%~5=%~1" + ) +) +goto :EOF + +:isnumber +set "var="&for /f "delims=0123456789." %%i in ("%~1") do set var=%%i +if defined var (exit /b 1) +exit /b 0 + +:comparepyversion +REM Exits with status 0 if equal, 1 if v1 gtr v2, 2 if v1 lss v2 +for /f "tokens=1,2,3 delims=." %%a in ("%~1") do ( + set a1=%%a + set a2=%%b + set a3=%%c +) +for /f "tokens=1,2,3 delims=." %%a in ("%~2") do ( + set b1=%%a + set b2=%%b + set b3=%%c +) +if not defined a1 set a1=0 +if not defined a2 set a2=0 +if not defined a3 set a3=0 +if not defined b1 set b1=0 +if not defined b2 set b2=0 +if not defined b3 set b3=0 +if %a1% gtr %b1% exit /b 1 +if %a1% lss %b1% exit /b 2 +if %a2% gtr %b2% exit /b 1 +if %a2% lss %b2% exit /b 2 +if %a3% gtr %b3% exit /b 1 +if %a3% lss %b3% exit /b 2 +exit /b 0 + :askinstall cls echo ### ### echo # Python Not Found # echo ### ### echo. -echo Python was not found on the system or in the PATH var. +echo Python !targetpy! was not found on the system or in the PATH var. echo. set /p "menu=Would you like to install it now? [y/n]: " if /i "!menu!"=="y" ( @@ -92,7 +174,7 @@ if not exist "%TEMP%\pyurl.txt" ( echo Parsing for latest... pushd "%TEMP%" :: Version detection code slimmed by LussacZheng (https://github.com/corpnewt/gibMacOS/issues/20) -for /f "tokens=9 delims=< " %%x in ('findstr /i /c:"Latest Python 3 Release" pyurl.txt') do ( set "release=%%x" ) +for /f "tokens=9 delims=< " %%x in ('findstr /i /c:"Latest Python !targetpy! Release" pyurl.txt') do ( set "release=%%x" ) popd echo Found Python !release! - Downloading... @@ -102,36 +184,39 @@ del "%TEMP%\pyurl.txt" REM At this point - we should have the version number. REM We can build the url like so: "https://www.python.org/ftp/python/[version]/python-[version]-amd64.exe" set "url=https://www.python.org/ftp/python/!release!/python-!release!-amd64.exe" +set "pytype=exe" +if "!targetpy!" == "2" ( + set "url=https://www.python.org/ftp/python/!release!/python-!release!.amd64.msi" + set "pytype=msi" +) REM Now we download it with our slick powershell command -powershell -command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; (new-object System.Net.WebClient).DownloadFile('!url!','%TEMP%\pyinstall.exe')" +powershell -command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; (new-object System.Net.WebClient).DownloadFile('!url!','%TEMP%\pyinstall.!pytype!')" REM If it doesn't exist - we bail -if not exist "%TEMP%\pyinstall.exe" ( +if not exist "%TEMP%\pyinstall.!pytype!" ( goto checkpy ) REM It should exist at this point - let's run it to install silently echo Installing... -echo pyinstall.exe /quiet PrependPath=1 Include_test=0 Shortcuts=0 Include_launcher=0 pushd "%TEMP%" -pyinstall.exe /quiet PrependPath=1 Include_test=0 Shortcuts=0 Include_launcher=0 +if /i "!pytype!" == "exe" ( + echo pyinstall.exe /quiet PrependPath=1 Include_test=0 Shortcuts=0 Include_launcher=0 + pyinstall.exe /quiet PrependPath=1 Include_test=0 Shortcuts=0 Include_launcher=0 +) else ( + set "foldername=!release:.=!" + echo msiexec /i pyinstall.msi /qb ADDLOCAL=ALL TARGETDIR="%LocalAppData%\Programs\Python\Python!foldername:~0,2!" + msiexec /i pyinstall.msi /qb ADDLOCAL=ALL TARGETDIR="%LocalAppData%\Programs\Python\Python!foldername:~0,2!" +) popd -echo Installer finsihed with %ERRORLEVEL% status. +echo Installer finished with %ERRORLEVEL% status. REM Now we should be able to delete the installer and check for py again -del "%TEMP%\pyinstall.exe" +del "%TEMP%\pyinstall.!pytype!" REM If it worked, then we should have python in our PATH REM this does not get updated right away though - let's try REM manually updating the local PATH var set "spath=" set "upath=" -for /f "tokens=2* delims= " %%i in ('reg.exe query "HKCU\Environment" /v "Path" 2^> nul') do ( - if NOT "%%j"=="" ( - set "upath=%%j" - ) -) -for /f "tokens=2* delims= " %%i in ('reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^> nul') do ( - if NOT "%%j"=="" ( - set "spath=%%j" - ) -) +for /f "tokens=2* delims= " %%i in ('reg.exe query "HKCU\Environment" /v "Path" 2^> nul') do ( if not "%%j" == "" set "upath=%%j" ) +for /f "tokens=2* delims= " %%i in ('reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^> nul') do ( if not "%%j" == "" set "spath=%%j" ) if not "!spath!" == "" ( REM We got something in the system path set "PATH=!spath!" @@ -151,8 +236,8 @@ cls set "args=%*" set "args=!args:"=!" if "!args!"=="" ( - python "!thisDir!!script_name!" + "!pypath!" "!thisDir!!script_name!" ) else ( - python "!thisDir!!script_name!" %* + "!pypath!" "!thisDir!!script_name!" %* ) goto :EOF