バッチファイルでOSバージョンを取得する必要があります。私は多くの例をオンラインで見ましたが、多くはこのコードのようなものを使用しています:
@echo off
ver | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp
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 Vista" > nul
if %ERRORLEVEL% == 0 goto ver_Vista
goto warnthenexit
:ver_7
:Run Windows 7 specific commands here.
echo Windows 7
goto exit
:ver_Vista
:Run Windows Vista specific commands here.
echo Windows Vista
goto exit
:ver_xp
:Run Windows XP specific commands here.
echo Windows XP
goto exit
:warnthenexit
echo Machine undetermined.
:exit
問題は、VistaまたはWindows 7でこれを実行するとメッセージが表示されることです
マシン未定
私がしたいことをする他の方法はありますか?
wmic
コマンドを使用してみましたか?
wmic os get version
これにより、コマンドラインにバージョン番号が表示され、バッチファイルに統合するだけで済みます。
ver
の出力のみを解析することにより、この情報を取得するのがはるかに簡単(かつ高速)です。
@echo off
setlocal
for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j
if "%version%" == "10.0" echo Windows 10
if "%version%" == "6.3" echo Windows 8.1
if "%version%" == "6.2" echo Windows 8.
if "%version%" == "6.1" echo Windows 7.
if "%version%" == "6.0" echo Windows Vista.
rem etc etc
endlocal
この表 MSDNドキュメントでは、どのバージョン番号がどのWindows製品バージョンに対応するかを示しています(6.1はWindows 7の情報を意味します)。
このテクニックの唯一の欠点は、同等のサーバーバージョンとWindowsのコンシューマバージョンを区別できないことです。
これらの1行のコマンドは、Windows XP、Server 2012、7、および10でテストされています(ありがとう Mad Tom Vane )。
cmd
コンソールでバージョンx.y
を抽出しますfor /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k) else (echo %i.%j))
x.y.z
を抽出しますfor /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k.%l) else (echo %i.%j.%k))
%%
の代わりに%
を使用します@echo off
for /f "tokens=4-7 delims=[.] " %%i in ('ver') do (if %%i==Version (set v=%%j.%%k) else (set v=%%i.%%j))
echo %v%
抽出されたバージョン番号は、必ずしもWindowsの名前のリリースに対応するとは限らないことに注意してください。 Microsoft Windowsバージョンの全リスト からの抜粋を参照してください。
10.0
Windows 106.3
Windows Server 20126.3
Windows 8.1/!\
6.2
Windows 8/!\
6.1
Windows 7/!\
6.0
Windows Vista5.2
Windows XP x645.1
Windows XP5.0
Windows 20004.10
Windows 98
Agent Gibbs および peterbh からの回答もアップしてください。私の答えは彼らのアイデアに触発されているためです。
私はそれが古い質問であることを知っていますが、これらは検索する人々のためにここに置くのに十分役に立つと思いました。
この最初の方法は、適切なバージョンを取得するための簡単なバッチ方法です。別のプロセスでサーバーまたはワークステーション(重要な場合)かどうかを確認できます。私はそれを追加するのに時間がかかりませんでした。
この構造をコード内で使用して、要件への準拠を確保します。私はもっと多くの優雅な方法があると確信していますが、これは常に機能します。
:: -------------------------------------
:: Check Windows Version
:: 5.0 = W2K
:: 5.1 = XP
:: 5.2 = Server 2K3
:: 6.0 = Vista or Server 2K8
:: 6.1 = Win7 or Server 2K8R2
:: 6.2 = Win8 or Server 2K12
:: 6.3 = Win8.1 or Server 2K12R2
:: 0.0 = Unknown or Unable to determine
:: --------------------------------------
echo OS Detection: Starting
ver | findstr /i "5\.0\."
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 2000
)
ver | findstr /i "5\.1\."
if %ERRORLEVEL% EQU 0 (
echo OS = Windows XP
)
ver | findstr /i "5\.2\."
if %ERRORLEVEL% EQU 0 (
echo OS = Server 2003
)
ver | findstr /i "6\.0\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Vista / Server 2008
)
ver | findstr /i "6\.1\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 7 / Server 2008R2
)
ver | findstr /i "6\.2\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 8 / Server 2012
)
ver | findstr /i "6\.3\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 8.1 / Server 2012R2
)
この2つ目は求められたものではありませんが、探している人にとっては役に立つかもしれません。
これは、サーバー(ワークステーション)であるかどうかなど、バージョン情報を提供するVBscript関数です。
private function GetOSVer()
dim strOsName: strOsName = ""
dim strOsVer: strOsVer = ""
dim strOsType: strOsType = ""
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOS in colOSes
strOsName = objOS.Caption
strOsVer = left(objOS.Version, 3)
Select Case strOsVer
case "5.0" 'Windows 2000
if instr(strOsName, "Server") then
strOsType = "W2K Server"
else
strOsType = "W2K Workstation"
end if
case "5.1" 'Windows XP 32bit
strOsType = "XP 32bit"
case "5.2" 'Windows 2003, 2003R2, XP 64bit
if instr(strOsName, "XP") then
strOsType = "XP 64bit"
elseif instr(strOsName, "R2") then
strOsType = "W2K3R2 Server"
else
strOsType = "W2K3 Server"
end if
case "6.0" 'Vista, Server 2008
if instr(strOsName, "Server") then
strOsType = "W2K8 Server"
else
strOsType = "Vista"
end if
case "6.1" 'Server 2008R2, Win7
if instr(strOsName, "Server") then
strOsType = "W2K8R2 Server"
else
strOsType = "Win7"
end if
case "6.2" 'Server 2012, Win8
if instr(strOsName, "Server") then
strOsType = "W2K12 Server"
else
strOsType = "Win8"
end if
case "6.3" 'Server 2012R2, Win8.1
if instr(strOsName, "Server") then
strOsType = "W2K12R2 Server"
else
strOsType = "Win8.1"
end if
case else 'Unknown OS
strOsType = "Unknown"
end select
Next
GetOSVer = strOsType
end Function 'GetOSVer
別のバリエーションがあります:XPで動作しない他のソリューションもありますが、これは RLHソリューション に影響を受けています。
このスクリプトは、必要なWindowsバージョンを検出した場合にのみ続行します。この例では、win 7でのみスクリプトを実行するため、他のウィンドウをサポートするには、GOTO :NOTTESTEDWIN
からGOTO :TESTEDWIN
ver | findstr /i "5\.0\." && (echo Windows 2000 & GOTO :NOTTESTEDWIN)
ver | findstr /i "5\.1\." && (echo Windows XP 32bit & GOTO :NOTTESTEDWIN)
ver | findstr /i "5\.2\." && (echo Windows XP x64 / Windows Server 2003 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.0\." > nul && (echo Windows Vista / Server 2008 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.1\." > nul && (echo Windows 7 / Server 2008R2 & GOTO :TESTEDWIN)
ver | findstr /i "6\.2\." > nul && (echo Windows 8 / Server 2012 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.3\." > nul && (echo Windows 8.1 / Server 2012R2 & GOTO :NOTTESTEDWIN)
ver | findstr /i "10\.0\." > nul && (echo Windows 10 / Server 2016 & GOTO :NOTTESTEDWIN)
echo "Could not detect Windows version! exiting..."
color 4F & pause & exit /B 1
:NOTTESTEDWIN
echo "This is not a supported Windows version"
color 4F & pause & exit /B 1
:TESTEDWIN
REM put your code here
これは、xpの場合は5.1、windows 7の場合は6/1を返します
for /f "tokens=4-7 delims=[.] " %%i in ('ver') do (
if %%i == Version set OSVersion=%%j.%%k
if %%i neq Version set OSVersion=%%i.%%j
)
ですから、私がここで読んだ答えはほとんど長いものです。アレックスによる最短回答はうまくいきますが、それほどきれいではありません。
最良の部分は、他の人とは異なり、それが高速に動作することです。
私は自分のワンライナーを思いついた:
FOR /F "usebackq tokens=3,4,5" %i IN (`REG query "hklm\software\Microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %i %j %k
上記はコマンドプロンプト用です。バッチファイルで動作させるには、すべての%を%%に置き換えて、次のようにします。
FOR /F "usebackq tokens=3,4,5" %%i IN (`REG query "hklm\software\Microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %%i %%j %%k
私のコンピューターでは、単にWindows 10 Proを生成します
Regクエリを使用すると、実際の名前が取得されます。regquery "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"/v ProductName
これにより、「Windows 7 Professional」、「Windows Server 2008 R2 Standard」などが返されます。その後、verコマンドと組み合わせて正確なバージョンを取得できます。
実際、verには文字列にxpが含まれているため、その1つのライナーはWindows XPでは機能しません。必要な5.1の代わりに、追加されたトークンのために[Version.5を取得します。
コマンドを次のように変更しました:for /f "tokens=4-6 delims=[. " %%i in ('ver') do set VERSION=%%i.%%j
これにより、xpシステム用のVersion.5が出力され、バッチファイル内のシステムを識別するために使用できます。悲しいことに、このコマンドは32bit
XPを示す5.2から.2を読み取らないため、64bit
と64bit
ビルドを区別できないことを意味します。
%%k
そのトークンを割り当てることができますが、ver文字列のトークンが1つ少ないため、このスクリプトはWindows Vista、7、または8を適切に検出しません。お役に立てれば!
Windowsバージョンを確認するための1つのライナーを次に示します。
for /f "tokens=1-9" %%a in ('"systeminfo | find /i "OS Name""') do (set ver=%%e & echo %ver%)
これは、Windowsバージョンi.e。、XP、Vista、7を返し、「ver」の値を同じ値に設定します...
@echo off
for /f "tokens=2 delims=:" %%a in ('systeminfo ^| find "OS Name"') do set OS_Name=%%a
for /f "tokens=* delims= " %%a in ("%OS_Name%") do set OS_Name=%%a
for /f "tokens=3 delims= " %%a in ("%OS_Name%") do set OS_Name=%%a
if "%os_name%"=="XP" set version=XP
if "%os_name%"=="7" set version=7
これにより、OS名が「7」または「XP」として取得されます。
次に、これを変数で使用して、Windowsのバージョンに基づいて特定のコマンドを実行できます。
wmic os get Caption,CSDVersion /value
これは仕事をします。
フルバージョンx.y.zを抽出 @olibreによって提案されたものは、私に最も適しているように見えます。唯一の追加事項は、英語以外の言語を考慮することです。文字列「バージョン」は、ローカライズされたWindowsでは完全に異なる場合があるためです。したがって、ここに、Windows XP、7、8.1、および10でテストされた、米国とロシアのロケールを使用したバッチファイルがあります。
for /f "tokens=4-5 delims= " %%i in ('ver') do (
if "%%j"=="" (set v=%%i) else (set v=%%j)
)
for /f "tokens=1-3 delims=.]" %%i in ("%v%") do (
set OS_VER_MAJOR=%%i
set OS_VER_MINOR=%%j
set OS_BUILD_NUM=%%k
)
echo Detected OS version: %OS_VER_MAJOR%.%OS_VER_MINOR%.%OS_BUILD_NUM%
%OS_VER_MAJOR%、%OS_VER_MINOR%、および%OS_BUILD_NUM%の値は、正確なバージョン番号を確認できます。
Windows 10などのバッチファイルでWindowsバージョンを表示するだけの場合.
単にver
と入力するだけでver
と入力でき、Windowsバージョンが表示されます
新しいビルドで必要な場合、最初の行はWMIコンソールのインストールを強制します。 WMIは常に「Version = x.x.xxxx」の一貫した文字列を返すため、トークンの解析はすべてのWindowsバージョンで常に同じです。
VER出力からの解析には、バージョン情報の前に可変テキストがあり、トークンの位置がランダムになります。区切り文字は「=」と「。」のみです。文字。
バッチの追加により、Win10の「510」(XP)から「10000」までのバージョンを簡単に確認できます。 Build値は使用しません。
Setlocal EnableDelayedExpansion
wmic os get version /value 1>nul 2>nul
if %errorlevel% equ 0 (
for /F "tokens=2,3,4 delims==." %%A In ('wmic os get version /value') Do (
(Set /A "_MAJ=%%A")
(Set /A "_MIN=%%B")
(Set /A "_BLD=%%C")
)
(Set /A "_OSVERSION=!_MAJ!*100")
(Set /A "_OSVERSION+=!_MIN!*10")
)
endlocal