信じられないかもしれませんが、私のインストーラーは非常に古く、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ビットリダイレクトが原因です)。
コンピューターが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ビットであることを示しています。
コマンドボックスで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ビット版の両方)によって自動的に定義される環境変数です。
以下は、プログラムが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;
私は私の質問で提案したソリューションをテストしました:
Windows環境変数のテスト:ProgramW6432
空でない場合は、64ビットWindows.Wです。
バッチスクリプトから:
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
ソース:
API呼び出しを行うことができる場合は、 GetProcAddress / GetModuleHandle を使用して、64があるWindows OSにのみ存在する IsWow64Process の存在を確認してください。ビットバージョン。
また、後方互換性のためにVista/2008で使用されているProgramFiles(x86)環境変数を試すこともできますが、XP-64については100%確信がありませんまたは2003-64。
幸運を!
ログインスクリプト内でこれを使用して、64ビットWindowsを検出しました
if "%ProgramW6432%" == "%ProgramFiles%" goto is64flag
使用している言語はわかりませんが、OSが64ビットの場合、 。NET には環境変数PROCESSOR_ARCHITEW6432
があります。
アプリケーションが32ビットと64ビットのどちらを実行しているかだけを知りたい場合は、IntPtr.Size
を確認できます。 32ビットモードで実行している場合は4、64ビットモードで実行している場合は8です。
OSまたはハードウェアの実際のビット数(32または64)を取得するVBScript/WMIワンライナーについては、 http://csi-windows.com/toolkitをご覧ください/ csi-getosbits
ここで、シェルスクリプトで使用するもの(ただし、任意の言語で簡単に使用できます)を追加します。その理由は、ここでのソリューションの一部は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
多くの回答が、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
どのバージョンの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
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
私はこれを使用します:
@echo off
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
echo 64 BIT
) else (
echo 32 BIT
)
Windows XPで動作し、Windowsでテスト済みXP Professional 64ビットと32ビットの両方。
最善の方法は、「Program Files」と「Program Files(x86)」の2つのプログラムファイルディレクトリがあるかどうかを確認することです。この方法の利点は、o/sが実行されていないときに実行できることです。マシンが起動に失敗し、オペレーティングシステムを再インストールしたい
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)
バッチスクリプトのより簡単な方法を次に示します。
@echo off
goto %PROCESSOR_ARCHITECTURE%
:AMD64
echo AMD64
goto :EOF
:x86
echo x86
goto :EOF
私はこれが古代であることを知っていますが、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
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ビットでテストしました。
興味深いことに、私が使用する場合
get-wmiobject -class Win32_Environment -filter "Name='PROCESSOR_ARCHITECTURE'"
AMD64は32ビットと64ビットの両方のISE(Win7 64ビット)で入手できます。
別の方法 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