@echo off
SetLocal EnableExtensions
:: Получаю необходимые переменные
call :GetOSBitness bitOS
call :GetProcessBitness "%bitOS%" bitProc
echo.
echo Битность ОС: %bitOS%
echo Битность процесса: %bitProc%
echo.
:: Сравниванию битности и перезапускаю процесс под x64 при необходимости
call :DoEnvironRelaunch "%bitOS%" "%bitProc%"
pause
goto :eof
:DoEnvironRelaunch [in.OS.Bitness] [in.Process.Bitness]
:: Контроль запуска скрипта в среде, соответствующей разрядности ОС
:: Попытка перезапустить процесс в режиме x64
if /i "%~1"=="x64" if /i "%~2" NEQ "x64" (
rem Если ОС >= Vista или XP с hotfix-ом http://support.microsoft.com/kb/942589
rem попытаюсь перезапустить процесс через алиас Sysnative
if exist "%windir%\Sysnative\*" (
;;; echo. Скрипт запущен из 32-битной среды. Пытаюсь перезапустить из x64.
;;; echo. Нажмите ENTER.
pause >NUL
cls
"%windir%\Sysnative\cmd.exe" /c "%~nx0"
exit
) else (
;;; echo Предпринят запуск из-под 32-битного приложения.
;;; echo СТРОГО рекомендуется перезапустить скрипт
;;; echo из проводника Windows.
;;; echo Работа скрипта будет завершена.
exit
)
)
Exit /B 0
:GetOSBitness [out.var]
Set "%~1=x64"& If /i "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set "%~1=x32"
Exit /B
:GetProcessBitness [in.OS.Bitness] [out.var]
set "%~2=x32"& if "%~1"=="x64" echo "%PROGRAMFILES%" |>nul find /i "x86" || set "%~2=x64"
Exit /B