web-dev-qa-db-ja.com

現在のWindowsバージョンが32ビットか64ビットかを検出する

信じられないかもしれませんが、私のインストーラーは非常に古く、64ビットバージョンのWindowsを検出するオプションがありません。

Windows DLL=呼び出しまたは(さらに良い)Windows XPおよびWindows Vistaの情報を提供する環境変数はありますか?)

1つの可能な解決策

ウィキペディアには、Windows XPおよびWindows Vistaの64ビットバージョンには固有の環境変数_%ProgramW6432%_があると記載されているため、32ビットWindowsでは空になると推測しています。

この変数は_Program Files_ディレクトリを指します。このディレクトリには、Windowsなどのインストール済みプログラムがすべて保存されます。英語システムのデフォルトは_C:\Program Files_です。 64ビット版のWindows(XP、2003、Vista)では、%ProgramFiles(x86)%がデフォルトでC:\Program Files (x86)に、_%ProgramW6432%_がデフォルトで_C:\Program Files_になっています。 _%ProgramFiles%_自体は、環境変数を要求するプロセス自体が32ビットか64ビットかによって異なります(これはWindows-on-Windows 64ビットリダイレクトが原因です)。

62
Clay Nichols

コンピューターが32ビットまたは64ビットのオペレーティングシステムを実行しているかどうかを確認する方法にリストされているバッチスクリプトを参照してください。また、レジストリからこれを確認する手順も含まれています。

次のレジストリの場所を使用して、コンピューターで32ビットまたは64ビットのWindowsオペレーティングシステムが実行されているかどうかを確認できます。

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0

右ペインに次のレジストリエントリが表示されます。

Identifier     REG_SZ             x86 Family 6 Model 14 Stepping 12
Platform ID    REG_DWORD          0x00000020(32)

上記の「x86」および「0x00000020(32)」は、オペレーティングシステムのバージョンが32ビットであることを示しています。

9
Leif Gruenwoldt

コマンドボックスで64ビットバージョンのWindowsを確認するには、次のテンプレートを使用します。

test.bat:

_@echo off
if defined ProgramFiles(x86) (
    @echo yes
    @echo Some 64-bit work
) else (
    @echo no
    @echo Some 32-bit work
)
_

ProgramFiles(x86)は、Windows 64ビットマシンのみでcmd.exe(32ビット版と64ビット版の両方)によって自動的に定義される環境変数です。

63
Dror Harari

以下は、プログラムが64ビットオペレーティングシステムで実行されているかどうかを確認するためのDelphiコードです。

function Is64BitOS: Boolean;
{$IFNDEF WIN64}
type
  TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall;
var
  hKernel32 : Integer;
  IsWow64Process : TIsWow64Process;
  IsWow64 : BOOL;
{$ENDIF}
begin
  {$IFDEF WIN64}
     //We're a 64-bit application; obviously we're running on 64-bit Windows.
     Result := True;
  {$ELSE}
  // We can check if the operating system is 64-bit by checking whether
  // we are running under Wow64 (we are 32-bit code). We must check if this
  // function is implemented before we call it, because some older 32-bit 
  // versions of kernel32.dll (eg. Windows 2000) don't know about it.
  // See "IsWow64Process", http://msdn.Microsoft.com/en-us/library/ms684139.aspx
  Result := False;
  hKernel32 := LoadLibrary('kernel32.dll');
  if hKernel32 = 0 then RaiseLastOSError;
  try
    @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');
    if Assigned(IsWow64Process) then begin
      if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin
        Result := IsWow64;
      end
      else RaiseLastOSError;
    end;
  finally
    FreeLibrary(hKernel32);
  end;  
  {$ENDIf}
end;
20
Blorgbeard

私は私の質問で提案したソリューションをテストしました:

Windows環境変数のテスト:ProgramW6432

空でない場合は、64ビットWindows.Wです。

13
Clay Nichols

バッチスクリプトから:

IF PROCESSOR_ARCHITECTURE == x86 AND
   PROCESSOR_ARCHITEW6432 NOT DEFINED THEN
   // OS is 32bit
ELSE
   // OS is 64bit
END IF

Windowsの使用 [〜#〜] api [〜#〜]

if (GetSystemWow64Directory(Directory, MaxDirectory) > 0) 
   // OS is 64bit
else
   // OS is 32bit

ソース:

  1. HOWTO:プロセスのビットネスを検出
  2. GetSystemWow64Directory関数
13
Leif Gruenwoldt

API呼び出しを行うことができる場合は、 GetProcAddress / GetModuleHandle を使用して、64があるWindows OSにのみ存在する IsWow64Process の存在を確認してください。ビットバージョン。

また、後方互換性のためにVista/2008で使用されているProgramFiles(x86)環境変数を試すこともできますが、XP-64については100%確信がありませんまたは2003-64。

幸運を!

8
Jason

ログインスクリプト内でこれを使用して、64ビットWindowsを検出しました

if "%ProgramW6432%" == "%ProgramFiles%" goto is64flag

6
TallGuy

使用している言語はわかりませんが、OSが64ビットの場合、 。NET には環境変数PROCESSOR_ARCHITEW6432があります。

アプリケーションが32ビットと64ビットのどちらを実行しているかだけを知りたい場合は、IntPtr.Sizeを確認できます。 32ビットモードで実行している場合は4、64ビットモードで実行している場合は8です。

4
Andrew Ensley

OSまたはハードウェアの実際のビット数(32または64)を取得するVBScript/WMIワンライナーについては、 http://csi-windows.com/toolkitをご覧ください/ csi-getosbits

4
Darwin

ここで、シェルスクリプトで使用するもの(ただし、任意の言語で簡単に使用できます)を追加します。その理由は、ここでのソリューションの一部はWoW64で動作しない、一部は実際にはそれを意図しないものを使用する(*(x86)フォルダーがあるかどうかを確認する)、またはcmdスクリプトで動作しないからです。これはそれを行うための「適切な」方法であり、将来のバージョンのWindowsでも安全であるはずです。

 @echo off
 if /i %processor_architecture%==AMD64 GOTO AMD64
 if /i %PROCESSOR_ARCHITEW6432%==AMD64 GOTO AMD64
    rem only defined in WoW64 processes
 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
    rem I feel there should always be a proper error-path!
    @echo Unsupported architecture!
    pause
 :END
3
Josef

多くの回答が、IsWoW64Process()または関連する関数の呼び出しに言及しています。これはcorrectの方法ではありません。この目的のために設計されたGetNativeSystemInfo()を使用する必要があります。以下に例を示します。

SYSTEM_INFO info;
GetNativeSystemInfo(&info);

if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
  // It's a 64-bit OS
}

参照: https://msdn.Microsoft.com/en-us/library/windows/desktop/ms724340%28v=vs.85%29.aspx

3
jcoffland

どのバージョンのWindowsが存在するのかわかりませんが、Windows Vista以降ではこれが実行されます:

Function Is64Bit As Boolean
    Dim x64 As Boolean = System.Environment.Is64BitOperatingSystem
    If x64 Then
       Return true
    Else
       Return false
    End If
End Function
2
nicu96

C#の場合:

public bool Is64bit() {
    return Marshal.SizeOf(typeof(IntPtr)) == 8;
}

VB.NET

Public Function Is64bit() As Boolean
   If Marshal.SizeOf(GetType(IntPtr)) = 8 Then Return True
   Return False
End Function
1
Renaud Bompuis

私はこれを使用します:

@echo off
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
 echo 64 BIT
) else (
 echo 32 BIT
)

Windows XPで動作し、Windowsでテスト済みXP Professional 64ビットと32ビットの両方。

1
user83250

最善の方法は、「Program Files」と「Program Files(x86)」の2つのプログラムファイルディレクトリがあるかどうかを確認することです。この方法の利点は、o/sが実行されていないときに実行できることです。マシンが起動に失敗し、オペレーティングシステムを再インストールしたい

0
jasee

Windows 7 x64/x86およびWindows XP x86で次のバッチファイルをテストし、問題ありませんが、Windows XP x64をまだ試していませんが、これはおそらく機能します。

If Defined ProgramW6432 (Do x64 stuff or end if you are aiming for x86) else (Do x86 stuff or end if you are aiming for x64) 
0
Match

バッチスクリプトのより簡単な方法を次に示します。

    @echo off

    goto %PROCESSOR_ARCHITECTURE%

    :AMD64
    echo AMD64
    goto :EOF

    :x86 
    echo x86
    goto :EOF
0
Max

私はこれが古代であることを知っていますが、Win764を検出するために私が使用するものはここにあります

On Error Resume Next

Set objWSHShell = CreateObject("WScript.Shell")

strWinVer = objWSHShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\BuildLabEx")

If len(strWinVer) > 0 Then
    arrWinVer = Split(strWinVer,".")
    strWinVer = arrWinVer(2)
End If

Select Case strWinVer
Case "x86fre"
strWinVer = "Win7"
Case "AMD64fre"
    strWinVer = "Win7 64-bit"
Case Else
    objWSHShell.Popup("OS Not Recognized")
    WScript.Quit
End Select
0
Verbose

Windows Powershellを使用して、次の式がtrueを返す場合、それは64ビットOSです。

(([Array](Get-WmiObject -Class Win32_Processor | Select-Object AddressWidth))[0].AddressWidth -eq 64)

これは、 http://depsharee.blogspot.com/2011/06/how-do-detect-operating-system.html (方法#3)から取得および変更されました。これをWin7 64ビット(32ビットと64ビットの両方のPowerShellセッションで)およびXP 32ビットでテストしました。

0
CJBS

興味深いことに、私が使用する場合

get-wmiobject -class Win32_Environment -filter "Name='PROCESSOR_ARCHITECTURE'"

AMD64は32ビットと64ビットの両方のISE(Win7 64ビット)で入手できます。

0
Mike Shepard

別の方法 eGermanによって作成 コンパイル済み実行可能ファイルのPE番号を使用します(レジストリレコードまたは環境変数に依存しません):

@echo off &setlocal


call :getPETarget "%SystemRoot%\Explorer.exe"


if "%=ExitCode%" EQU "00008664" (
    echo x64
) else (
    if "%=ExitCode%" EQU "0000014C" (
        echo x32
    ) else (
        echo undefined
    )
)


goto :eof


:getPETarget FilePath
:: ~~~~~~~~~~~~~~~~~~~~~~
:: Errorlevel
::   0 Success
::   1 File Not Found
::   2 Wrong Magic Number
::   3 Out Of Scope
::   4 No PE File
:: ~~~~~~~~~~~~~~~~~~~~~~
:: =ExitCode
::   CPU identifier

setlocal DisableDelayedExpansion
set "File=%~1"
set Cmp="%temp%\%random%.%random%.1KB"
set Dmp="%temp%\%random%.%random%.dmp"

REM write 1024 times 'A' into a temporary file
if exist "%File%" (
  >%Cmp% (
    for /l %%i in (1 1 32) do <nul set /p "=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  )
  setlocal EnableDelayedExpansion
) else (endlocal &cmd /c exit 0 &exit /b 1)

REM generate a HEX dump of the executable file (first 1024 Bytes)
set "X=1"
>!Dmp! (
  for /f "skip=1 tokens=1,2 delims=: " %%i in ('fc /b "!File!" !Cmp!^|findstr /vbi "FC:"') do (
    set /a "Y=0x%%i"
    for /l %%k in (!X! 1 !Y!) do echo 41
    set /a "X=Y+2"
    echo %%j
  )
)
del !Cmp!

REM read certain values out of the HEX dump
set "err="
<!Dmp! (
  set /p "A="
  set /p "B="
  REM magic number has to be "MZ"
  if "!A!!B!" neq "4D5A" (set "err=2") else (
    REM skip next 58 bytes
    for /l %%i in (3 1 60) do set /p "="
    REM bytes 61-64 contain the offset to the PE header in little endian order
    set /p "C="
    set /p "D="
    set /p "E="
    set /p "F="
    REM check if the beginning of the PE header is part of the HEX dump
    if 0x!F!!E!!D!!C! lss 1 (set "err=3") else (
      if 0x!F!!E!!D!!C! gtr 1018 (set "err=3") else (
        REM skip the offset to the PE header
        for /l %%i in (65 1 0x!F!!E!!D!!C!) do set /p "="
        REM next 4 bytes have to contain the signature of the PE header
        set /p "G="
        set /p "H="
        set /p "I="
        set /p "J="
        REM next 2 bytes contain the CPU identifier in little endian order
        set /p "K="
        set /p "L="
      )
    )
  )
)
del !Dmp!
if defined err (endlocal &endlocal &cmd /c exit 0 &exit /b %err%)

REM was the signature ("PE\0\0") of the PE header found
if "%G%%H%%I%%J%"=="50450000" (
  REM calculate the decimal value of the CPU identifier
  set /a "CPUID=0x%L%%K%"
) else (endlocal &endlocal &cmd /c exit 0 &exit /b 4)
endlocal &endlocal &cmd /c exit %CPUID% &exit /b 0
0
npocmaka