web-dev-qa-db-fra.com

Lot pour détecter si le système est un 32 bits ou 64 bits

Quelqu'un sait-il comment créer un fichier de commandes pouvant traiter un programme dans un système 64 bits ou un autre dans un système 32 bits?

17
philip

Vérifiez que %PROCESSOR_ARCHITECTURE% est x86:

if %PROCESSOR_ARCHITECTURE%==x86 (
  rem 32 bit
) else (
  rem 64 bit
)

Au moins pour le moment. Sur un serveur auquel j'ai accès, c'est AMD64, mais je ne vois pas du tout à quoi ressemble Itanium, par exemple. Mais les versions 32 bits signalent toujours x86.

Une autre option, qui fonctionne aussi sur WoW64:

for /f "skip=1 delims=" %%x in ('wmic cpu get addresswidth') do if not defined AddressWidth set AddressWidth=%%x

if %AddressWidth%==64 (
  rem 64 bit
) else (
  rem 32 bit
)
23
Joey

Cela fonctionne aussi sans WMI! Je suggère:

 @echo off
 if /i "%processor_architecture%"=="AMD64" GOTO AMD64
 if /i "%PROCESSOR_ARCHITEW6432%"=="AMD64" GOTO AMD64
 if /i "%processor_architecture%"=="x86" GOTO x86
 GOTO ERR
 :AMD64
    rem do AMD64 stuff
 GOTO EXEC
 :x86
    rem do x86 stuff
 GOTO EXEC
 :EXEC
    rem do Arch independent stuff
 GOTO END
 :ERR
 @echo Unsupported architecture "%processor_architecture%"!
 pause
 :END
12
Josef
uname -a #for mac

uname -i #for ubuntu
5
ajmartin

Et moyen facile serait de tester l'existence du dossier %SystemRoot%\SysWOW64. Bien que ce ne soit pas à 100% infaillible, c'est un très bon moyen de détecter si le système est en 64 bits.

3
Mehrdad

Tous les lots ne fonctionnent pas dans Windows 8 x64.

Après le travail avec moi:

@cd %programfiles(x86)%\

@if %ERRORLEVEL% == 0 (echo x64&&pause)

@if %ERRORLEVEL% == 1 (echo x86&&pause)
2
ducanhnguyen2k

Cette ligne vous donnera ce que vous voulez, fonctionne sur XP, Vista et 7

enregistrez-le en tant que .bat ou .cmd

If Defined ProgramFiles(x86) (\\Fileserver\Distribution\Softwarex64.exe) else (\\Fileserver\Distribution\Softwarex86.exe)

Si la source d'installation de la machine locale pointe simplement vers elle (D:\Programs\Softwarex64.exe)

et si vous voulez simplement exécuter des commandes et ne pas installer, tapez simplement la commande que vous voulez pour x64 Entre la première () et les commandes pour x86 Entre la seconde ()

If Defined ProgramFiles(x86) (ipconfig /all & @echo  This Is A 64-bit System ) else (arp -a & @echo This Is A 32-bit System)

Copiez ceci dans votre CMD pour le tester 

J'espère que ça aide

1
Match

Sous Linux, vous pouvez simplement utiliser "Arch" sur la ligne de commande.

ubuntu# Arch
x86_64

Sur OSX (Snow Leopard), il renvoie "i386", même si vous utilisez du matériel 64 bits.

0
Preston Lee
0
michael

La méthode ci-dessous devrait être assez fiable car elle fonctionnera même si les variables d'environnement ont été modifiées:

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'

Cette méthode repose sur le fait que "% WINDIR%\System32\kernel32.dll" doit être présent sur tous les systèmes Windows. Les versions 64 bits de Windows incluent également le répertoire "% WINDIR%\SysWOW64" contenant les versions 32 bits des fichiers système, qui n'est pas présent sur les systèmes 32 bits. 

Sur les systèmes 64 bits, les applications 32 bits sont redirigées vers SysWOW64 lors de la tentative d'accès aux fichiers dans System32. Ainsi, si nous obtenons la même taille kernel32.dll de System32 et de SysWOW64, cela signifie que la redirection est effective et que notre script s'exécute dans une console 32 bits sur un système d'exploitation 64 bits. 

0
R.G.