現在のマシンがバッチファイル内で64ビットOSまたは32ビット OSを実行しているかどうかを確認できますか?
編集:
これをオンラインで見つけました、そしてそれは今私にとって十分です:
これは、Microsoft のナレッジベース リファレンス ( http://support.microsoft.com/kb/556009 ) に従ってチェックを実行する正しい方法であり、コードを 1 行だけに再編集しました。
環境変数やフォルダー名に依存せず、代わりにレジストリを直接チェックします。
以下の完全なバッチ ファイルに示されているように、環境変数OSは、必要に応じて使用できる32BITまたは64BITに設定されます。
@echo OFF
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT
if %OS%==32BIT echo This is a 32bit operating system
if %OS%==64BIT echo This is a 64bit operating system
次のいずれかを使用します。
:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:64BIT
echo 64-bit...
GOTO END
:32BIT
echo 32-bit...
GOTO END
:END
またはbit
、後でスクリプトで使用して正しいセットアップを実行する変数を設定します。
:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (set bit=x64) ELSE (set bit=x86)
また...
:CheckOS
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x86) else (set bit=x64)
お役に立てれば。
これらだけを行うとうまくいくようです:
echo "%PROCESSOR_ARCHITECTURE%"
OSアーキテクチャ(x64またはx86)に応じて特定のことを行うこれらのスクリプトを見つけました:
@echo off
echo Detecting OS processor type
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto 64BIT
echo 32-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\i386\DPMAgentInstaller_x86 /q
goto END
:64BIT
echo 64-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\amd64\DPMAgentInstaller_x64 /q
:END
"C:\Program Files\Microsoft Data Protection Manager\DPM\bin\setdpmserver.exe" -dpmservername sa
GOTOなしで方法を見つけてみてください...
Unix システムを扱う人にとってuname -m
は、うまくいくでしょう。
管理者としてスクリプトを実行している場合、スクリプトは wmic コマンドを使用できます。
FOR /f "tokens=2 delims==" %%f IN ('wmic os get osarchitecture /value ^| find "="') DO SET "OS_ARCH=%%f"
IF "%OS_ARCH%"=="32-bit" GOTO :32bit
IF "%OS_ARCH%"=="64-bit" GOTO :64bit
ECHO OS Architecture %OS_ARCH% is not supported!
EXIT 1
:32bit
ECHO "32 bit Operating System"
GOTO :SUCCESS
:64bit
ECHO "64 bit Operating System"
GOTO :SUCCESS
:SUCCESS
EXIT 0
'ProgramFiles(x86)' は、Windows 64 ビット マシンでのみ cmd.exe (32 ビット バージョンと 64 ビット バージョンの両方) によって自動的に定義される環境変数です。
@ECHO OFF
echo Check operating system ...
if defined PROGRAMFILES(X86) (
echo 64-bit sytem detected
) else (
echo 32-bit sytem detected
)
pause
PROCESSOR_ARCHITECTURE=x86
Win32 で表示されます。
PROCESSOR_ARCHITECTURE=AMD64
Win64 で表示されます。
32 ビットcmd.exe
プロセスを実行している場合、Windows は 2 つの環境変数を提示します。
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
ここに簡潔なバージョンがあります:
set isX64=False && if /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( set isX64=True ) else ( if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( set isX64=True ) )
echo %isX64%
「Program Files (x86)」ディレクトリを何かの証拠として使用しないでください。いたずらなソフトウェアは、32 ビット マシンでこのディレクトリを簡単に作成できます。代わりに、PROCESSOR_ARCHITECTURE および PROCESSOR_ARCHITEW6432 環境変数を使用してください。
ここでの回答はどれも私の場合(64ビットプロセッサだが32ビットOS)では機能しなかったため、私にとって有効なソリューションは次のとおりです。
(set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
私は通常、次のことを行います。
:Check_Architecture
if /i "%processor_architecture%"=="x86" (
IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
REM Run 32 bit command
) ELSE (
REM Run 64 bit command
)
) else (
REM Run 64 bit command
)
これが私の個人的なお気に入り、論理爆弾です:)
::32/64Bit Switch
ECHO %PROCESSOR_ARCHITECTURE%|FINDSTR AMD64>NUL && SET ARCH=AMD64 || SET ARCH=x86
ECHO %ARCH%
PAUSE
AND ( &&
) と OR ( ) を使用||
すると、これはIF THEN ELSE
バッチ コンストラクトです。
次のレジストリの場所を使用して、コンピューターが 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 ビットであることを示します。
異なるバージョンの Windows の多くの DOS コマンドは似ていますが、異なるパラメーターをサポートしている場合があります。さらに、新しいバージョンの Windows では、新しいコマンドがサポートされたり、古いコマンドが廃止されたりする場合があります。したがって、さまざまな種類のマシンで実行できるバッチ ファイルを作成する場合は、バッチ ファイルが実行されている Windows のバージョンを特定することが有益な場合があります。このようにして、バッチ ファイルはオペレーティング システムに適したコマンドを実行できます。
次のバッチ ファイルは、マシンが Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP、Windows 2000、または Windows NT を実行しているかどうかを判断します。必要に応じて他のバージョンの Windows をサポートするように、または検出された Windows のバージョンに基づいて環境変数を設定するように、簡単に変更できます。このバッチ ファイルは、新しいバージョンの Windows Server とコンシューマ バージョンの Windows を正しく区別するために、他の場所で見られるバッチ ファイルよりも複雑であることに注意してください。以下にその理由を説明しました。
1) メモ帳ウィンドウを開きます。
2) 次のテキストをメモ帳にコピーします (一部の行が折り返されているため、このヒントの印刷版にアクセスすることをお勧めします)。
@echo off
ver | find "2003" > nul
if %ERRORLEVEL% == 0 goto ver_2003
ver | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp
ver | find "2000" > nul
if %ERRORLEVEL% == 0 goto ver_2000
ver | find "NT" > nul
if %ERRORLEVEL% == 0 goto ver_nt
if not exist %SystemRoot%\system32\systeminfo.exe goto warnthenexit
systeminfo | find "OS Name" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i
echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto ver_7
echo %vers% | find "Windows Server 2008" > nul
if %ERRORLEVEL% == 0 goto ver_2008
echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto ver_vista
goto warnthenexit
:ver_7
:Run Windows 7 specific commands here.
echo Windows 7
goto exit
:ver_2008
:Run Windows Server 2008 specific commands here.
echo Windows Server 2008
goto exit
:ver_vista
:Run Windows Vista specific commands here.
echo Windows Vista
goto exit
:ver_2003
:Run Windows Server 2003 specific commands here.
echo Windows Server 2003
goto exit
:ver_xp
:Run Windows XP specific commands here.
echo Windows XP
goto exit
:ver_2000
:Run Windows 2000 specific commands here.
echo Windows 2000
goto exit
:ver_nt
:Run Windows NT specific commands here.
echo Windows NT
goto exit
:warnthenexit
echo Machine undetermined.
:exit
3) ファイルを %WINDIR%\whichvers.bat として保存します。
4) 次に、コマンド プロンプトから次のように入力します。
どちらでも
これにより、実行している Windows のバージョンが表示されます。
ノート:
VER コマンドではなく SYSTEMINFO コマンドを使用する理由は、Windows Server 2008 が他の Windows リリースとバージョン番号を「共有」しているためです (Microsoft を参照)。したがって、Windows Vista を検出するために 6.0 の "バージョン番号" に依存したり、Windows 7 を検出するために 6.1 の "バージョン番号" に依存したりすると、Windows Server 2008 または Windows Server 2008 R2 とマシンを区別できなくなります。
%TEMP%\osname.txt の作成は、systeminfo | の結果を配置できなかったためです。for /f コマンドで「OS 名」を直接検索します。パイプされたコマンドは好きではありません。SYSTEMINFO から情報を取得するより簡単な方法を見つけることができます。その場合は、コメントしてください。
環境変数 %vers% の先頭にスペースがあります。より長いバッチ ファイルを使用してこれらを削除することもできますが、この場合は必要ありません。
バッチ ファイルは SYSTEMINFO を検出します。これは、古いオペレーティング システムの検出を超えた場合、実行中の Windows のバージョンがさらに古く、このユーティリティが存在しないことを前提としています。Windows 7 64 ビットでは、まだ %SystemRoot%\system32 フォルダーにあります。Windows の新しいバージョンが 64 ビットのみになる場合、このバッチ ファイルを更新する必要がある場合があります。
Windows XP と DOS のページに戻ります。
参考までに、%PROCESSOR_ARCHITECTURE% の使用をやめてみてください。これは、SCCM がバージョン 2012 前後で変更を行い、常に 32 ビット プロセスでパッケージ/プログラムを起動するためです (x64 をインストールできますが、環境変数は x86 として表示されます)。私は今使っています;
IF EXIST "%SystemDrive%\Program Files (x86)" GOTO X64
ジャック
SAM が前に書き込むための正しい方法は次のとおりです。
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" /v "識別子" | 検索 /i "x86" > NUL && set OS=32BIT || OS=64BITに設定
しかし、/v "Identifier"は少し正しいです。