- ベストアンサー
バッチファイルで文字列取得
複数台のパソコンに(Win XP Pro)コマンドsysteminfoを使用しOSのサービスパックがSP1のものにはSP2を適用しSP2のものにはスキップして次の処理を行いたいと思っています。コマンドfindを使用すれば検索したい文字列の行は取得できるのですが、サービスパックのバージョンのみ取得して判断基準に使用したいと思っています。何かいい方法はありますでしょうか。フリーツール等は使用出来ません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
文字列の、"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)
- QSW73j2gda
- ベストアンサー率90% (10/11)
とりあえず、systeminfo の出力から "OS バージョン:" を含む行を抜き出して、 その行の内容で条件判断する例です。 systeminfo と find を、FOR 文 の usebackq オプションで実行して、 その結果を環境変数にセットする、という方法です。 FOR を抜けると、OSVER 環境変数に、1行丸ごと OS バージョン: 5.1.2600 Service Pack 2 ビルド 2600 のように入ってきます。後はそのまま使ってもいいですし、 後ろ半分だけ抜き出すとちょっとカッコイイ(笑)。 もっとエレガントな方法があると思いますが一例として。 あと、ウチには SP2 しかないので、SP1 の場合に systeminfo が どういう出力になるかは分からないので適当です。 @echo off SET OSVER=UNKNOWN :/ systeminfo コマンドの実行結果から "OS バージョン:" を含む行を抜き出す :/ ただし、"BIOS バージョン:" の行は無視 :/ その行を、環境変数 OSVER にセット for /F "usebackq delims=" %%I in (`"systeminfo 2>nul | find "OS バージョン:" | find /v "BIOS バージョン:" "`) do set OSVER=%%I :/ 見つかっていれば、19 文字目以降を抜き出してセットし直す if not "%OSVER%"=="UNKNOWN" set OSVER=%OSVER:~19% if "%OSVER%"=="5.1.2600 Service Pack 1 ビルド 2600" ( echo たぶんサービスパック1 ) if "%OSVER%"=="5.1.2600 Service Pack 2 ビルド 2600" ( echo たぶんサービスパック2 ) if "%OSVER%"=="UNKNOWN" ( echo サービスパック不明 )
補足
サービスパック1の時は"5.1.2600 Service Pack 1 ビルド 2600"と表示ます。この2種類しかないならこの方法で決まりです。 可能であれば、文字列の位置指定ではなく"Service Pack 1"と"Service Pack 2"を変数に渡すことは出来ないもんでしょうか?ここまで完璧な方法を教えてもらっていて申し訳ないんですが。。。。位置指定で取得した場合この形式で表示されない場合判定条件がおかしくなってしまうので。