
No.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
No.1
- 回答日時:
とりあえず、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"を変数に渡すことは出来ないもんでしょうか?ここまで完璧な方法を教えてもらっていて申し訳ないんですが。。。。位置指定で取得した場合この形式で表示されない場合判定条件がおかしくなってしまうので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 新卒・第二新卒 就活 新卒 自己PR 強み 添削お願いします。 以下の文章で自己PRを書いてみたのですが、どこが競争 3 2023/02/25 21:27
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- オープンソース 素人です 1 2022/09/01 19:01
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- 法人税 法人 自家用車の事業使用について 2 2023/05/04 02:21
- JavaScript HTMLでJavaScriptを使用してプログラムを作ります。 入力されたパスワードを取得して、パス 2 2022/10/18 01:05
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチでテキストファイルから...
-
子バッチ内のキー入力処理へ自...
-
バッチのforで文字を抽出したい
-
コマンドプロンプトで2ヶ月前3...
-
バッチファイルで昨日の日付を取得
-
バッチファイルでの環境変数の...
-
バッチファイルの環境変数を別...
-
引数付のバッチにて、引数内容...
-
VBアプリケーションで終了コー...
-
WinMailCmdのバッチファイルに...
-
コマンドプロンプト 半角スペー...
-
バッチファイル テキストファイ...
-
テキストファイル内の半角スペ...
-
バッチファイルでDirで取得した...
-
echoとsystem関数について
-
【バッチ】不特定多数のテキス...
-
大量のフォルダからひとつのフ...
-
コマンドプロンプトのエラーに...
-
コマンドプロンプトの「%1」と...
-
batからexeを実行し戻り値を受...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチでテキストファイルから...
-
バッチファイルで昨日の日付を取得
-
バッチファイルでDirで取得した...
-
コマンドプロンプトで2ヶ月前3...
-
コマンドプロンプト標準出力と...
-
コマンドプロンプト(バッチファ...
-
DOSのバッチで、変数中のファイ...
-
バッチファイルで常に最新の現...
-
バッチファイル テキストファイ...
-
子バッチ内のキー入力処理へ自...
-
VBアプリケーションで終了コー...
-
IPアドレスの第3オクテットだ...
-
コマンドプロンプト画面の閉じ...
-
呼び出し元バッチを知るには?
-
絶対パス名からファイル名を取...
-
コマンドプロンプト(バッチ)...
-
DOSのバッチで、テキストファイ...
-
バッチファイルに日付(ミリ秒...
-
コマンドプロンプト 半角スペー...
-
バッチファイル(for文)がうま...
おすすめ情報