web-dev-qa-db-ja.com

システムが32ビットか64ビットかを検出するバッチ

64ビットシステムの場合は1つのプログラムをシェル化し、32ビットシステムの場合は別のプログラムをシェル化するバッチファイルを作成する方法を知っている人はいますか?

17
philip

%PROCESSOR_ARCHITECTURE%x86であることを確認します。

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

少なくとも当面は。サーバーではAMD64にアクセスできますが、たとえばItaniumがどのように見えるかはわかりません。ただし、32ビットバージョンは常にx86を報告します。

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

WMIがなくても機能します。私は提案します:

 @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
uname -a #for mac

uname -i #for ubuntu
5
ajmartin

簡単な方法は、%SystemRoot%\SysWOW64フォルダの存在をテストすることです。 100%万能というわけではありませんが、システムが64ビットかどうかを検出するのに非常に適しています。

3
user541686

私のWindows 8 x64では、そこにあるすべてのバッチが機能しません。

私と一緒に次の作業:

@cd %programfiles(x86)%\

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

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

このラインはあなたが望むものをあなたに与えます、XP、Vistaと7で動作します

.batまたは.cmdとして保存します

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

ローカルマシンのインストールソースがそれを指している場合(D:\ Programs\Softwarex64.exe)

コマンドを実行するだけでインストールしない場合は、最初のx64間でx64に必要なコマンドを入力し、2番目のx)でx86のコマンドを入力します

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

これをCMDにコピーしてテストします

これが役に立てば幸い

1
Match

Linuxでは、コマンドラインで「Arch」を使用するだけです。

ubuntu# Arch
x86_64

OSX(Snow Leopard)では、64ビットハードウェアを使用している場合でも、「i386」を返します。

0
Preston Lee
0
michael

以下の方法は、環境変数が乱されていても機能するため、かなり信頼できるはずです。

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には、32ビットシステムには存在しない32ビットバージョンのシステムファイルを含む「%WINDIR%\ SysWOW64」ディレクトリも含まれています。

64ビットシステムでは、System32のファイルにアクセスしようとすると、32ビットアプリケーションがSysWOW64にリダイレクトされます。したがって、System32とSysWOW64の両方から同じサイズのkernel32.dllを取得した場合、リダイレクトが有効であり、スクリプトが64ビットOSの32ビットコンソールで実行されていることを意味します。

0
R.G.