This became a huge batch-file which I need to refactor into smaller bits.
:: based on bc.bat :: needs to be refactored into find-bc.bat :: assumes git is on the path :begin @echo off :checkGit :: https://stackoverflow.com/questions/4781772/how-to-test-if-an-executable-exists-in-the-path-from-a-windows-batch-file/25696405#25696405 where /q git || echo Cound not find git on the PATH %PATH%. && goto :eof :: for now, the above is good enough as git installs itself on the path, but Beyond Compare does not. :findBeyondCompare setlocal EnableExtensions EnableDelayedExpansion IF /I [%PROCESSOR_ARCHITECTURE%] == [amd64] goto :x64 IF /I [%PROCESSOR_ARCHITEW6432%] == [amd64] goto :x64 goto :x86 :x64 :: OS is 64bit set hkcuBaseKey=HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare set hklmBaseKey=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Scooter Software\Beyond Compare goto :findBC :x86 :: OS is 32bit set hkcuBaseKey=HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare set hklmBaseKey=HKEY_LOCAL_MACHINE\SOFTWARE\Scooter Software\Beyond Compare goto :findBC :findBC :: https://gist.github.com/rojepp/634908 :: http://stackoverflow.com/questions/5369528/windows-batch-reg-query-key-value-to-a-variable-but-do-not-display-error-if-key set SupportedBeyondCompareVersions=3, 4 for %%v in (%SupportedBeyondCompareVersions%) do ( for /f "usebackq tokens=2* delims= " %%c in (`reg query "%hkcuBaseKey% %%v" /v ExePath 2^>NUL`) do ( call :do set bcExe="%%d" ) ) if not [%bcExe%]==[] goto :foundBC for /f "usebackq tokens=2* delims= " %%c in (`reg query "%hkcuBaseKey%" /v ExePath 2^>NUL`) do ( call :do set bcExe="%%d" ) if not [%bcExe%]==[] goto :foundBC for %%v in (%SupportedBeyondCompareVersions%) do ( for /f "usebackq tokens=2* delims= " %%c in (`reg query "%hklmBaseKey% %%v" /v ExePath 2^>NUL`) do ( call :do set bcExe="%%d" ) ) if not [%bcExe%]==[] goto :foundBC for /f "usebackq tokens=2* delims= " %%c in (`reg query "%hklmBaseKey%" /v ExePath 2^>NUL`) do ( call :do set bcExe="%%d" ) :: note that FOR /R needs a wildcard! if not [%bcExe%]==[] goto :foundBC for /r . %%d in (bcompare*.exe) do ( call :do set bcExe="%%d" ) :foundBC :: https://stackoverflow.com/questions/2772456/string-replacement-in-batch-file :: note the BCompExe assignment requires at least https://ss64.com/nt/setlocal.html to have EnableDelayedExpansion and likely EnableExtensions :: see https://ss64.com/nt/delayedexpansion.html for ! expansion if [%bcExe%]==[] ( echo no bc.exe found in registry or relative to batch file) else ( echo bcExe=%bcExe% if exist %bcExe% ( call :do set bcCompExe=%bcExe:BCompare=BComp% :: echo bcCompExe=!bcCompExe! echo "Beyond Compare" %bcExe:\=/% echo "BComp" !bcCompExe:\=/! call :do git config --global diff.tool bc call :do git config --global difftool.bc.path !bcCompExe:\=/! call :do git config --global merge.tool bc call :do git config --global mergetool.bc.path !bcCompExe:\=/! ) if not exist %bcExe% echo not found: [%bcExe%] ) :exit endlocal :end goto :eof :do echo %* call %* goto :eof
–jeroen






