web-dev-qa-db-ja.com

バッチファイルでWindowsバージョンを取得する

バッチファイルで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でこれを実行するとメッセージが表示されることです

マシン未定

私がしたいことをする他の方法はありますか?

27
Yerko Antonio

wmicコマンドを使用してみましたか?

wmic os get version

これにより、コマンドラインにバージョン番号が表示され、バッチファイルに統合するだけで済みます。

13
liamog

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のコンシューマバージョンを区別できないことです。

47
Jon

これらの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 10
6.3 Windows Server 2012
6.3 Windows 8.1/!\
6.2 Windows 8/!\
6.1 Windows 7/!\
6.0 Windows Vista
5.2 Windows XP x64
5.1 Windows XP
5.0 Windows 2000
4.10 Windows 98

Agent Gibbs および peterbh からの回答もアップしてください。私の答えは彼らのアイデアに触発されているためです。

18
olibre

私はそれが古い質問であることを知っていますが、これらは検索する人々のためにここに置くのに十分役に立つと思いました。

この最初の方法は、適切なバージョンを取得するための簡単なバッチ方法です。別のプロセスでサーバーまたはワークステーション(重要な場合)かどうかを確認できます。私はそれを追加するのに時間がかかりませんでした。

この構造をコード内で使用して、要件への準拠を確保します。私はもっ​​と多くの優雅な方法があると確信していますが、これは常に機能します。

:: -------------------------------------
:: 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
6
RLH

別のバリエーションがあります: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
3
Badr Elmers

これは、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
)
3
peterbh

ですから、私がここで読んだ答えはほとんど長いものです。アレックスによる最短回答はうまくいきますが、それほどきれいではありません。

最良の部分は、他の人とは異なり、それが高速に動作することです。

私は自分のワンライナーを思いついた:

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を生成します

3
Shraddha Kishan

Regクエリを使用すると、実際の名前が取得されます。regquery "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"/v ProductName

これにより、「Windows 7 Professional」、「Windows Server 2008 R2 Standard」などが返されます。その後、verコマンドと組み合わせて正確なバージョンを取得できます。

2
Mike Swanson

実際、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を読み取らないため、64bit64bitビルドを区別できないことを意味します。

%%kそのトークンを割り当てることができますが、ver文字列のトークンが1つ少ないため、このスクリプトはWindows Vista、7、または8を適切に検出しません。お役に立てれば!

2
Agent Gibbs

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」の値を同じ値に設定します...

2
user1
@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のバージョンに基づいて特定のコマンドを実行できます。

1
user3246197
wmic os get Caption,CSDVersion /value

これは仕事をします。

1
Alex

フルバージョン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%の値は、正確なバージョン番号を確認できます。

1
DVV

Windows 10などのバッチファイルでWindowsバージョンを表示するだけの場合.

単にverと入力するだけでverと入力でき、Windowsバージョンが表示されます

1
RN Tech

新しいビルドで必要な場合、最初の行は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
0
Bruce Gavin