• ベストアンサー

バッチファイルで文字列取得

複数台のパソコンに(Win XP Pro)コマンドsysteminfoを使用しOSのサービスパックがSP1のものにはSP2を適用しSP2のものにはスキップして次の処理を行いたいと思っています。コマンドfindを使用すれば検索したい文字列の行は取得できるのですが、サービスパックのバージョンのみ取得して判断基準に使用したいと思っています。何かいい方法はありますでしょうか。フリーツール等は使用出来ません。

質問者が選んだベストアンサー

  • ベストアンサー
回答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

その他の回答 (1)

回答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 サービスパック不明 )

ittope
質問者

補足

サービスパック1の時は"5.1.2600 Service Pack 1 ビルド 2600"と表示ます。この2種類しかないならこの方法で決まりです。 可能であれば、文字列の位置指定ではなく"Service Pack 1"と"Service Pack 2"を変数に渡すことは出来ないもんでしょうか?ここまで完璧な方法を教えてもらっていて申し訳ないんですが。。。。位置指定で取得した場合この形式で表示されない場合判定条件がおかしくなってしまうので。

関連するQ&A

  • 1列目の何行目に検索文字があるかを取得したい

    しかしエラーになってしまいます。 エラーの原因がわかりません。 シートの1列目のどこかに「test」と入っている行があるのですが Sub test1() Dim myRow As Long With Sheets("Sheet") myRow = .Column(1).Find(What:="test").Row MsgBox .Cells(myRow, 1) End With End Sub このvbaコードを実行するとエラーになります。 コードとしては「.Column(1)」で1列目と言う意味で、 .Find(What:="test")で、何行目に「test」があるかを取得するという意味だと思うのですが 実行時エラー438が発生します。 実際にtestと言う文字は2行目にあるのですが なぜmyRowに2が代入されないのでしょうか?

  • バッチファイルについての質問です

    バッチファイルの質問です。宜しくお願いします。 バッチファイルでテキストファイルの中から指定した文字列が入っている行をとり、指定した文字列を除いた文字列が欲しいのですが、どのようなコマンドを使用すればできるでしょうか? ----------------------- AAAランダム文字列1 BBBランダム文字列2 CCCランダム文字列3 DDDランダム文字列4 EEEランダム文字列5 ----------------------- 上記のようにテキストファイルに書かれていたとして、”ランダム文字列3”という文字だけを取得したいのです。 つたない説明文で申し訳ございませんが宜しくお願いします。

  • 検索文字が何行目にあるか、行番号を取得したい

    例えば、A1に「aiu」が入っていて、 B列のどこかの行に「aiu」があるのですが、 その行の番号を取得する関数を教えてください。 MATCH関数とfind関数を使えばいいのでしょうか? 使い方がわかりません。 よろしくお願いします。

  • バッチファイルでのMACアドレス取得について

    【環境】 Windows7 professional 32bit sp1 お世話になります。 上記環境でバッチファイルを起動し、 1.MACアドレスを取得 2.複数NICがある場合は全てのMACアドレスを取得 という処理を行いたいのですが、 echoで取得結果を確認すると値が入っていません。 バッチに関して理解不足で申し訳ありませんが、是非ご教授お願い致します。 以下、現在作成しているコマンドです。 for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set MAC=%%b 以上です。

  • バッチファイルでのMACアドレス取得について

    【環境】 Windows7 professional 32bit sp1 お世話になります。 上記環境でバッチファイルを起動し、 1.MACアドレスを取得 2.複数NICがある場合は全てのMACアドレスを取得 という処理を行いたいのですが、 echoで取得結果を確認すると値が入っていません。 バッチに関して理解不足で申し訳ありませんが、是非ご教授お願い致します。 以下、現在作成しているコマンドです。 for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set MAC=%%b 以上です。

  • ファイル内のある文字列以降を別ファイルに出力する方法

    よろしくお願いします。 MS-DOSコマンドによるバッチで次のことを検討中です。 (find や findstr 等を使用して試行錯誤していますが、 なかなか良い案が思い浮かびません。) やりたいこと  あるファイルの内容を上から順に確認していき、  あるキーワードを発見したら、それ以降の行を全て  別のファイルへ出力する。 どうぞ、アドバイスのほど、宜しくお願い致します。 (OS: Windows Server 2003, Windows 2000 Server ,Windows XP pro)

  • 多数のファイルに決まった文字列を挿入

    お世話になります。 多数あるファイルに、下記のルールで「#coding: euc-jp」という文字列を挿入したいと考えています。 ルール: ・「#!」で始まる行は読み飛ばし、「#!」ではないで始まる行が現れたら、その行の前に挿入する。 ・「#!」ではないで始まる行が存在しない場合は、ファイルの末尾に挿入する。 プログラムを書けばできるのでしょうが、なるべく sed や perl コマンド等で簡単にできる方法を考えています。 できれば、バックアップファイルは取得せず、変更前後でパーミッションが保持されればと考えています。(sed -i, perl -iのように) よろしくお願いいたします。

  • 複数の文字列を検索

    あるログファイルの文字列を取得して。検索でヒットした文字列行 を返すスクリプトを作成しております。 検索:"OK"    日付 対象行 : OK! Tue Jul 19 文字列"OK"は普通に # grep "OK" ログファイルPath で検索できますが、 文字列と日付を両方引っ掛ける場合は・・・ grep -e "OK" -e env LANG=c date -u +"%a %b $d" ログファイルPath 当然コマンドエラーになります。 dateコマンドから日付を取得して、grepにて引っ掛ける方法を知りたいので すが、お分かりになる方、ご教授お願い致します。

  • OEで文字列と文字列に1行自動で空けたい

    何時も見さして戴き勉強になります OEで相手の方が視力が弱いので太字にしていますが 出来たら文字列の間に1行開けたいんです さすればなを見やすいかと思うんです、ぜひお知恵を拝借出来ませんか 宜しくお願いします windows xo sp2,,,OEを使用してます 78歳の初心者です

  • テキストファイルの差分を取得するには?

    2つのテキストファイルの差分を取得したいと思っています。 rubyを使用してdiffコマンドの様な事は可能でしょうか? テキストを1行ずつ配列に入れて - で比較していく方法を使用してみたのですが、途中で行数が変わるような変更が起こっていると上手く動作できませんでした。 理想としては一部が変更された行、追加された行、削除された行といった物を取得したいです。 もし上手く解決出来る様な手法がありましたら、ご教示お願いいたします。

    • ベストアンサー
    • Ruby