文字列の、"Service Pack "とそれ以降のスペースの間を
切り出すようにしてみました。
1文字ずつループしながら比較してます(笑)。
その関係で、環境変数の遅延展開が必須です。
cmd /v:on の状態でないと正しく動きません。
なんだかすごく遠回りしてるような気がしてます。
WSH とか VBS とかを使えば簡単に済むような気がヒシヒシと(笑)。
@echo off
setlocal
:/ 環境変数の遅延展開が有効かどうか調べる
set b=hogehoge
if not !b!==hogehoge echo cmd /v:on の状態で実行してください & goto exit
:/ systeminfo コマンドの実行結果から "OS バージョン:" で始まる行を
:/ 環境変数 OSVER にセット
set OSVER=UNKNOWN
for /F "usebackq tokens=* delims=Service" %%I in (`"systeminfo 2>nul | findstr /B /L /C:"OS バージョン:""`) do set OSVER=%%I
if "%OSVER%"=="UNKNOWN" (
set SPVER=UNKNOWN
) else (
:/ OSVER から、"Service Pack " の文字列を検索するw
set nStart=0
set nLen=0
:/ 文字列長が 99 文字以下と仮定してるけど、ちゃんと数えるべきかも(どうやって?)
for /L %%I in (1,1,99) do (
:/ 13文字ぶんを大文字小文字無視で比較
if /i "!OSVER:~%%I,13!"=="service pack " (
:/ 見つかったら、その次からスペースを探す
set nStart=%%I
set /a nNext=%%I+13
for /L %%J in (!nNext!,1,99) do (
:/ "service pack " の頭から、見つかったスペースまでの間を切り出すww
:/ ほしいのは切り出す文字数
:/ 1回切り出したらそれまで
if !nLen! equ 0 (
if "!OSVER:~%%J,1!"==" " set /a nLen=%%J-%%I
:/ "service pack " から "ビルド" の間まで、とかwww
:/ if "!OSVER:~%%J,3!"=="ビルド" set /a nLen=%%J-%%I
)
)
)
)
)
:/ 開始位置と長さが求まったはずなので切り出す
set SPVER=UNKNOWN
:/ 開始位置がゼロでなければ("service pack "が見つかっていれば)
if !nStart! neq 0 (
if !nLen! equ 0 (
:/ 長さがゼロなら最後まで
set SPVER=!OSVER:~%nStart%!
) else (
:/ 長さがゼロでなければその長さ
set SPVER=!OSVER:~%nStart%,%nLen%!
)
)
:/ 条件に引っかからなければ UNKNWON のまま
echo SPVER=%SPVER%
if /i "%SPVER%"=="Service Pack 1" (
echo たぶんサービスパック1
) else if /i "%SPVER%"=="Service Pack 2" (
echo たぶんサービスパック2
) else (
echo サービスパック不明
)
:exit
endlocal
補足
サービスパック1の時は"5.1.2600 Service Pack 1 ビルド 2600"と表示ます。この2種類しかないならこの方法で決まりです。 可能であれば、文字列の位置指定ではなく"Service Pack 1"と"Service Pack 2"を変数に渡すことは出来ないもんでしょうか?ここまで完璧な方法を教えてもらっていて申し訳ないんですが。。。。位置指定で取得した場合この形式で表示されない場合判定条件がおかしくなってしまうので。