29

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 でこれを実行すると、メッセージが表示されることです。

不明なマシン

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

4

19 に答える 19

53

の出力を解析するだけで、この情報を取得する方がはるかに簡単 (かつ高速) です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

バージョン番号がどの Windows 製品バージョンに対応するかの MSDN ドキュメントに関するこの表(ここから 6.1 は Windows 7 の情報を意味します)。

この手法の唯一の欠点は、同等のサーバー バージョンとコンシューマ バージョンの Windows を区別できないことです。

于 2012-11-03T18:19:53.227 に答える
21

これらの 1 行のコマンドは、Windows XP、Server 2012、7、および 10 でテストされています ( Mad Tom Vaneに感謝します)。

コンソールでバージョンx.yを抽出するcmd

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))

バッチ スクリプト%%では、single の代わりに使用します%

@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     Windows 8     Windows 7     Windows Vista   Windows XP x64   Windows XP   Windows 2000   Windows 98 /!\
6.2/!\
6.1/!\
6.0
5.2
5.1
5.0
4.10

私の回答は彼らのアイデアに触発されているため、エージェント ギブスピーターブからの回答にも賛成票を投じてください。

于 2014-09-22T16:29:23.090 に答える
16

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

試す wmic os get version

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

于 2012-11-03T18:17:00.770 に答える
7

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

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

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

:: -------------------------------------
:: 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
于 2014-04-03T23:54:14.397 に答える
5

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

最良の部分は、他のものとは異なり、高速に動作することです.

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

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

于 2018-10-21T10:29:34.247 に答える
3

これは、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
)
于 2014-03-19T21:20:23.963 に答える
2

Windowsのバージョンを判断するための私のライナーは次のとおりです。

for /f "tokens=1-9" %%a in ('"systeminfo | find /i "OS Name""') do (set ver=%%e & echo %ver%)

これは、Windows のバージョン、つまり、XP、Vista、7 を返し、「ver」の値を同じに設定します...

于 2013-05-11T04:40:20.527 に答える
2

reg クエリを使用すると、実際の名前が得られます: reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

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

于 2015-12-22T22:07:32.233 に答える
2

実際には、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 が出力されます。これを使用して、バッチ ファイル内で上記のシステムを識別できます。悲しいことに、これは、 XPを表す 5.2 から .2 を読み取らないため、コマンドが32bitとビルドを区別できないことを意味します。64bit64bit

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

于 2013-08-08T14:21:50.900 に答える
1

Windows 10などのバッチファイルでWindowsのバージョンを単純に表示したい場合。

verコマンドを入力するだけでver、Windowsのバージョンが表示されます

于 2016-07-02T21:03:28.413 に答える
1
wmic os get Caption,CSDVersion /value

これは仕事をします。

于 2016-12-13T01:40:49.700 に答える
1
@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 のバージョンに基づいて特定のコマンドを実行できます。

于 2014-01-28T20:47:51.840 に答える
0

最近のバージョン (win 7 以降) では、powershell を使用して作業を行うことができます。

for /F %%i in ('powershell -command "& {$([System.Environment]::OSVersion.Version.Major),$([System.Environment]::OSVersion.Version.Minor) -join '.' }"') do set VER=%%i

goto %VER%


:6.1
REM specific code for windows 7

:10.0
REM specific code for windows 10

バージョン番号については、この表を参照してください

于 2020-01-28T13:30:32.077 に答える