@echo off cls setLocal EnableDelayedExpansion rem Get the running directory for later ease of use SET running_directory=%~dp0 rem Set where this file will install the rest of the files SET "install_location=%APPDATA%\CIRCLE" rem Set whether we want output info on screen or not IF NOT "%1"=="" ( SET "output_on_screen=%1" ) else ( SET "output_on_screen=False" ) rem Set whether we want to install selenium or not IF NOT "%2"=="" ( SET "install_selenium=%2" ) else ( SET "install_selenium=False" ) rem Set which website should the icon point to SET "website=" IF NOT "%3"=="" ( IF "%install_selenium%"=="False" ( SET site=%3 SET site=!site:"=! SET "website= -t ^"!site!^"" ) ) :BatchCheckElevated :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" REM --> If error flag set, we do not have admin. if '%errorlevel%' NEQ '0' ( echo Requesting administrative privileges... goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" set params = %*:"="" echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" exit /B :gotAdmin pushd "%CD%" CD /D "%~dp0" IF NOT "!output_on_screen!"=="False" ( @echo Elevated rights recived from UAC ) :-------------------------------------- rem Start the installation script IF NOT "!output_on_screen!"=="False" ( @echo Starting CIRCLE Client install script @echo. ) call :SUB_ARCHITECTURE architecture rem Decide whether python 2.x is installed or not SET "python_registry=" :PYTHON_CHECK SET index=8 :loop SET /a index-=1 IF %index% LSS 6 ( if "!architecture!"=="64" ( if "%python_registry%"=="" ( SET "python_registry=Wow6432Node\" GOTO PYTHON_CHECK ) else ( GOTO NOPYTHON ) ) else ( GOTO NOPYTHON ) ) SET version=2.%index% SET @query="hklm\SOFTWARE\%python_registry%Python\PythonCore\%version%" reg>nul query %@query% 2>nul IF ERRORLEVEL 1 GOTO loop IF ERRORLEVEL 0 GOTO HASPYTHON GOTO NOPYTHON rem No 2.6+ Python is installed :NOPYTHON IF NOT "!output_on_screen!"=="False" ( @echo No 2.6^+ Python is detected on the system. ) if "!architecture!"=="64" ( IF NOT "!output_on_screen!"=="False" ( @echo 64 bit system detected, commencing the install ) start /WAIT %running_directory%x64^\python-2.7.7.amd64.msi GOTO NOWHASPYTHON ) if "!architecture!"=="32" ( IF NOT "!output_on_screen!"=="False" ( @echo 32 bit system detected, commencing the install ) start /WAIT %running_directory%x86^\python-2.7.7.msi GOTO NOWHASPYTHON ) GOTO ERR rem Subroutine to decide whether it is 32 or 64 bit :SUB_ARCHITECTURE rem Decide what architecture the system is using if /i "%processor_architecture%"=="AMD64" ( SET %1=64 GOTO END ) if /i "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( SET %1=64 GOTO END ) if /i "%processor_architecture%"=="x86" ( SET %1=32 GOTO END ) GOTO ERR rem Error within the installation :ERR IF NOT "!output_on_screen!"=="False" ( @echo Unsupported architecture! Please install files manually @echo Please visit: https://www.python.org/downloads/ @echo Please visit: http://www.mozilla.org/en/firefox/new/ pause ) GOTO END rem The install program closed. Check whether the Python installation was successful :NOWHASPYTHON SET version=2.7 IF NOT "!output_on_screen!"=="False" ( @echo Python install finished, rechecking registry ) GOTO UACPrompt rem We have Python but let's check if it's in the PATH :HASPYTHON IF NOT "!output_on_screen!"=="False" ( @echo %version% Python is found, checking PATH variable ) rem Check Python install path set install_path= for /f "tokens=2,*" %%a in ('reg query "hklm\SOFTWARE\%python_registry%Python\PythonCore\%version%\InstallPath"') do ( set install_path=%%b ) set test=%install_path:~0,-1% call %running_directory%inPath test && (IF NOT "!output_on_screen!"=="False" (@echo %test% is already in PATH)) || (call %running_directory%addPath test & setx>nul PATH "%PATH%;%test%" & IF NOT "!output_on_screen!"=="False" ( @echo %test% set to local PATH)) set test=%install_path%Scripts call %running_directory%inPath test && (IF NOT "!output_on_screen!"=="False" (@echo %test% is already in PATH)) || (call %running_directory%addPath test & setx>nul PATH "%PATH%;%test%" & IF NOT "!output_on_screen!"=="False" ( @echo %test% set to local PATH)) GOTO PIP_CHECK rem Check whether PIP is installed or not :PIP_CHECK IF NOT "!output_on_screen!"=="False" ( @echo. @echo Checking if PIP is installed ) IF EXIST %install_path%Scripts/PIP.exe GOTO PIP_VERSION_CHECK IF NOT "!output_on_screen!"=="False" ( @echo No PIP found, commencing PIP install ) IF NOT "!output_on_screen!"=="False" ( call python %running_directory%get-pip.py ) else ( call python %running_directory%get-pip.py >nul 2>&1 ) rem Try to update the PIP :PIP_VERSION_CHECK IF NOT "!output_on_screen!"=="False" ( @echo PIP is found @echo Checking whether the latest PIP is installed ) IF NOT "!output_on_screen!"=="False" ( call python -m pip install --upgrade pip ) else ( call python -m pip install --upgrade pip >nul 2>&1 ) IF "%install_selenium%"=="False" ( SET "pip_program=winshell" ) else ( SET "pip_program=selenium" ) GOTO PIP_PACKAGE_CHECK rem Check if the PIP package is installed or not :PIP_PACKAGE_CHECK IF NOT "!output_on_screen!"=="False" ( @echo. @echo Check whether !pip_program! is installed ) for /f "tokens=1,2 delims===" %%a in ('call python -m pip freeze') do ( if "%%a"=="!pip_program!" ( IF NOT "!output_on_screen!"=="False" ( @echo %%b !pip_program! is found ) rem pywin32 cannot be installed or updated via pip if "!pip_program!"=="pywin32" goto CHECK_PACKAGE_LIST GOTO PIP_PACKAGE_UPDATE ) ) IF NOT "!output_on_screen!"=="False" ( @echo No !pip_program! version is found, commencing install ) GOTO PIP_PACKAGE_INSTALL rem Try to install the PIP package via PIP :PIP_PACKAGE_INSTALL IF NOT "!output_on_screen!"=="False" ( @echo Installing !pip_program! ) if "!pip_program!"=="pywin32" ( call python %running_directory%pywin_installer.py ) else ( IF NOT "!output_on_screen!"=="False" ( call python -m pip install !pip_program! ) else ( call python -m pip install !pip_program! >nul 2>&1 ) ) goto CHECK_PACKAGE_LIST rem Try to update Selenium :PIP_PACKAGE_UPDATE IF NOT "!output_on_screen!"=="False" ( @echo Trying to update !pip_program! call python -m pip install --upgrade !pip_program! ) else ( call python -m pip install --upgrade !pip_program! >nul 2>&1 ) goto CHECK_PACKAGE_LIST :CHECK_PACKAGE_LIST if "!pip_program!"=="selenium" ( set "pip_program=winshell" goto PIP_PACKAGE_CHECK ) if "!pip_program!"=="winshell" ( set "pip_program=pywin32" goto PIP_PACKAGE_CHECK ) if NOT "%install_selenium%"=="False" ( goto CHECK_BROWSER ) else ( goto FIN ) rem Get installed browsers :CHECK_BROWSER set browserToUse=None IF NOT "!output_on_screen!"=="False" ( @echo. @echo Checking installed browsers ) rem For 64 bit systems START /W REGEDIT /E "%Temp%\BROW3.reg" HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Clients\StartMenuInternet rem For 32 bit systems if not exist "%Temp%\BROW3.reg" START /W REGEDIT /E "%Temp%\BROW3.reg" HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet set count=1 for /f "tokens=*" %%B in ('type "%Temp%\BROW3.reg" ^| findstr /E "DefaultIcon]"') do ( rem Extracting browser name from icon path set "browser=%%B" rem Removing \DefaultIcon] string set "browser=!browser:\DefaultIcon]=!" rem Get the browser name for %%P in ("!browser!") do ( call :SUB_PRINTBROWSER %%~nP ) ) GOTO CHECK_BROWSER_TO_USE rem Subroutine to print installed browsers :SUB_PRINTBROWSER set subBrowser=%* CALL :UCase subBrowser upperBrowser if "%upperBrowser%"=="FIREFOX" ( IF NOT "!output_on_screen!"=="False" ( @echo !count!. %upperBrowser% ^(Recommended^) ^- will be used ) if NOT "%install_selenium%"=="False" ( SET "browserToUse=firefox" ) ) else ( IF NOT "!output_on_screen!"=="False" ( @echo !count!. %upperBrowser% ) ) set /a count+=1 GOTO END rem Determine which Selenium driver to use :CHECK_BROWSER_TO_USE if "!browserToUse!"=="None" ( IF NOT "!output_on_screen!"=="False" ( @echo Decide whitch browser to use @echo Checking which one is the Default browser ) START /W REGEDIT /E "%Temp%\BROW5.reg" HKEY_CLASSES_ROOT\http\shell\open\command for /f tokens^=3^ delims^=^" %%B in ('type "%Temp%\BROW5.reg" ^| find "@"') do ( set "default=%%B" rem removing double slashes set "default=!default:\\=\!" rem removing end slash set "default=!default:~0,-1!" rem get the name for %%D in ("!default!") do ( call :SUB_DEFAULTBROWSER %%~nD ) ) del /Q /F "%Temp%\BROW5.reg" ) ) else ( rem Registry location depends of the architecture if "!architecture!"=="64" ( set "browser_architect=Wow6432Node\" set "architecture_name=x64" ) else ( if "!architecture!"=="32" ( set "browser_architect=" set "architecture_name=x86" ) else ( GOTO ERR ) ) rem Registry names for the different browsers out there if "!browserToUse!"=="firefox" ( set "browser_path_name=FIREFOX.EXE" set "selenium_driver_name=" ) if "!browserToUse!"=="chrome" ( set "browser_path_name=Google Chrome" set "selenium_driver_name=chromedriver.exe" ) if "!browserToUse!"=="iexplore" ( set "browser_path_name=IEXPLORE.EXE" set "selenium_driver_name=IEDriverServer.exe" ) rem Opera have to versions (in the registry) Opera and OperaStable, we try to Stable first if "!browserToUse!"=="opera" ( set "browser_path_name=OperaStable" set "selenium_driver_name=" ) set "browser_path=" IF NOT "!output_on_screen!"=="False" ( @echo Check if !browserToUse!.exe is in PATH ) :get_browser_path set browser_path= set query="hklm\SOFTWARE\%browser_architect%Clients\StartMenuInternet\%browser_path_name%\shell\open\command" reg>nul query %query% 2>nul if ERRORLEVEL 1 ( if "%browser_path%"=="" ( if "%browser_architect%"=="" ( rem If the Stable failed check out the simple Opera if "%browser_path_name%"=="OperaStable" ( SET "browser_path_name=Opera" SET "browser_architect=Wow6432Node\" goto get_browser_path ) IF NOT "!output_on_screen!"=="False" ( @echo Location not found^^! Please add !browserToUse!.exe to PATH manually pause ) goto install_driver ) else ( set "browser_architect=" goto get_browser_path ) ) ) rem Get the installation path for the selected browser for /f "tokens=2,*" %%a in ('reg query %query%') do ( set browser_path=%%b ) set browser_path=%browser_path:"=% call :Split "%browser_path%" test set myTest=!test:~0,-1! rem Set that path in the PATH environment variable call %running_directory%inPath myTest && (IF NOT "!output_on_screen!"=="False" ( @echo !myTest! is already in PATH)) || (call %running_directory%addPath myTest & setx>nul PATH "%PATH%;!myTest!" & IF NOT "!output_on_screen!"=="False" ( @echo !myTest! set to local PATH) ) :install_driver IF NOT "%install_selenium%"=="False" ( if NOT "!selenium_driver_name!"=="" ( @echo Installing the !browserToUse! Selenium driver xcopy>nul "%running_directory%%architecture_name%^\%selenium_driver_name%" "!install_location!\" /y if ERRORLEVEL 0 ( IF NOT "!output_on_screen!"=="False" ( @echo Done ) ) else ( IF NOT "!output_on_screen!"=="False" ( @echo Error^^! Please copy the ^'chromedriver.exe^' to ^'!install_location!^\^' manually ) ) ) rem For the Opera we need to install the selenium standalone jar if "!browserToUse!"=="opera" ( SET "standalone_version=selenium-server-standalone-2.42.2.jar" IF NOT "!output_on_screen!"=="False" ( @echo Installing the Selenium server stand alone JAR ) xcopy>nul "%running_directory%!standalone_version!" "!install_location!\" if ERRORLEVEL 0 ( IF NOT "!output_on_screen!"=="False" ( @echo Done ) rem And set it in the SELENIUM_SERVER_JAR environment variable IF NOT "!output_on_screen!"=="False" ( @echo Setting the SELENIUM_SERVER_JAR environment variable ) setx>nul SELENIUM_SERVER_JAR "!install_location!^\!standalone_version!" IF NOT "!output_on_screen!"=="False" ( @echo local SELENIUM_SERVER_JAR set to ^'!install_location!^\!standalone_version!^' ) ) else ( IF NOT "!output_on_screen!"=="False" ( @echo Error^^! Please copy the ^'%standalone_version%^' to ^'!test!^' manually ) ) ) ) GOTO FIN ) GOTO ERR rem Finish up the install :FIN rem Create folder if needed and set it to PATH IF NOT "!output_on_screen!"=="False" ( @echo Checking wheter ^'%install_location%^\^' exists already ) call %running_directory%inPath install_location && (IF NOT "!output_on_screen!"=="False" ( @echo !install_location! is already in PATH)) || (call %running_directory%addPath install_location & setx>nul PATH "%PATH%;!install_location!" & IF NOT "!output_on_screen!"=="False" ( @echo !install_location! set to local PATH)) if not exist "%install_location%\" ( mkdir "%install_location%" ) if not exist "%install_location%\.rdp\" ( mkdir "%install_location%\.rdp" ) rem Copy the files to the folder IF NOT "!output_on_screen!"=="False" ( @echo Copying files to ^'%install_location%^' ) xcopy>nul "%running_directory%cloud.py" "%install_location%\" /y xcopy>nul "%running_directory%cloud_connect_from_windows.py" "%install_location%\" /y xcopy>nul "%running_directory%nxkey.py" "%install_location%\" /y xcopy>nul "%running_directory%OrderedDict.py" "%install_location%\" /y xcopy>nul "%running_directory%cloud.ico" "%install_location%\" /y xcopy>nul "%running_directory%putty.exe" "%install_location%\" /y IF NOT "!output_on_screen!"=="False" ( @echo Done @echo. ) IF "%install_selenium%"=="False" ( SET "create_url_icon= -u" ) else ( SET "create_url_icon=" ) IF NOT "!output_on_screen!"=="False" ( @echo Starting the python installation script ) if NOT "!browserToUse!"=="" ( SET "selenium_driver= -d !browserToUse!" ) IF NOT "!output_on_screen!"=="False" ( call python %running_directory%win_install.py!selenium_driver! ^-l "%install_location%\\"!create_url_icon!!website! ) else ( call python %running_directory%win_install.py!selenium_driver! ^-l "%install_location%\\"!create_url_icon!!website! >nul 2>&1 ) IF NOT "!output_on_screen!"=="False" ( @echo Done @echo Installation complete @echo Press any key to close this installer pause ) GOTO END rem Subroutine to decide which Selenium driver to use :SUB_DEFAULTBROWSER set defBrowser=%* CALL :LCase defBrowser lowerFound if "%lowerFound%"=="launcher" ( set "lowerFound=opera" ) IF NOT "!output_on_screen!"=="False" ( @echo %lowerFound% is the default browser ) set browserToUse=%lowerFound% GOTO END :LCase :UCase :: Converts to upper/lower case variable contents :: Syntax: CALL :UCase _VAR1 _VAR2 :: Syntax: CALL :LCase _VAR1 _VAR2 :: _VAR1 = Variable NAME whose VALUE is to be converted to upper/lower case :: _VAR2 = NAME of variable to hold the converted value :: Note: Use variable NAMES in the CALL, not values (pass "by reference") SET _UCase=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z SET _LCase=a b c d e f g h i j k l m n o p q r s t u v w x y z SET _Lib_UCase_Tmp=!%1! IF /I "%0"==":UCase" SET _Abet=%_UCase% IF /I "%0"==":LCase" SET _Abet=%_LCase% FOR %%Z IN (%_Abet%) DO SET _Lib_UCase_Tmp=!_Lib_UCase_Tmp:%%Z=%%Z! SET %2=%_Lib_UCase_Tmp% GOTO END rem Subroutine to get the exact path out from a file location, but strip the file name :Split SET %2=%~dp1 GOTO END :END