Приведенный ниже метод должен быть достаточно надежным, поскольку он будет работать, даже если переменные среды были перепутаны с:
rem If no kernel32.dll in System32, probably running on DOS or 16-bit Windows
if not exist "%SystemRoot%\System32\kernel32.dll" goto DOS
rem If no kernel32.dll in SysWOW64, likely a 32-bit Windows
if not exist "%SystemRoot%\SysWOW64\kernel32.dll" goto WIN32
rem If file size reported for kernel32.dll located in System32 and SysWOW64 is
rem the same, it likely means that System32 is being redirected to SysWOW64.
rem This would be the case for 32-bit version of cmd.exe running on 64-bit OS.
for %%I in ("%SystemRoot%\SysWOW64\kernel32.dll") do (
for %%J in ("%SystemRoot%\System32\kernel32.dll") do (
if "%%~zI" equ "%%~zJ" goto WOW64
)
)
rem If we get this far, the script is likely running in native 64-bit console
echo Native shell on 64-bit Windows
rem ...
exit /b
:WOW64
echo 32-bit shell on 64-bit Windows (WOW64)
rem ...
exit /b
:WIN32
echo 32-bit Windows
rem ...
goto END
:DOS
echo DOS or 16-bit Windows
rem ...
goto END
rem ...
:END
rem We can put this label at the end of the file to allow exiting script on
rem older systems that do not support 'exit /b'
Этот метод основан на том факте, что «% WINDIR% \ System32 \ kernel32.dll»должен присутствовать во всех системах Windows.64-разрядные версии Windows также включают каталог «% WINDIR% \ SysWOW64», содержащий 32-разрядные версии системных файлов, которых нет в 32-разрядных системах.
В 64-разрядных системах 32-разрядные приложения перенаправляются на SysWOW64 при попытке доступа к файлам в System32.Таким образом, если мы получаем одинаковый размер kernel32.dll как из System32, так и из SysWOW64, это означает, что перенаправление действует, и наш скрипт выполняется в 32-разрядной консоли на 64-разрядной ОС.