MS-DOSのバッチファイル作成(テキストの抽出方法)について

このQ&Aのポイント
  • MS-DOSのバッチファイル作成(テキストの抽出方法)について。複数台のマシン(PC,Unix)の死活監視を行なうDOSのバッチを作成しようとしています。バッチの内容としては、管理用PCから、それぞれの監視対象マシンに対してPINGを発行し、レスポンスがあれば(0%lossの場合)OKを表示し、レスポンスが無ければ(100%lossの場合)NGを表示するという簡単なものを考えています。
  • バッチの作成において、PINGの結果からlossの行を抜き出し、変数に入れて判定するところが上手くいかない問題が発生しています。ping xx.xx.xx.xx | find "loss" > temp.$$$ の結果から"0%loss"もしくは"100%loss"を抜き出し、変数に入れて、条件分岐を行いたいのですが、うまく動作しません。
  • 解決策を求めています。ご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。よろしくお願いします。
回答を見る
  • ベストアンサー

MS-DOSのバッチファイル作成(テキストの抽出方法)について(revise)

複数台のマシン(PC,Unix)の死活監視を行なうDOSのバッチを作成しようとしています。 バッチの内容としては、 ・管理用PCから、それぞれの監視対象マシンに対してPINGを発行し、レスポンスがあれば(0%lossの場合)OKを表示し、レスポンスが無ければ(100%lossの場合)NGを表示するという簡単なものを考えています。 しかしながら、PINGの結果からfindでlossの行を抜き出したまでは良いのですが、"0%loss"もしくは、"100%loss"を変数に入れて判定するところが、うまくいきません。 ping xx.xx.xx.xx | find "loss" > temp.$$$ temp.$$$から"0%loss"もしくは、"100%loss"を抜き出し、変数に入れて、 例えば、 for /F "tokens=* delims=" %%a in 'findstr /C "0% loss" temp.$$$') do set words=%%a set kekka=%words:~40,9% if "%%kekka" == "(0% loss)" goto OK :OK echo OK の様にしたいと思っています。 (上記では、うまくいきません。) お手数ですが、ご存知の方が居られましたらご教示ください。 よろしくお願いします。

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

  • ベストアンサー
  • snoopy64
  • ベストアンサー率42% (337/793)
回答No.1

回答しようと思ったら締め切られていて、どうしようかと思いました。 再質問してくれてよかった・・・ @cls @echo ping 応答待ちです。しばらくお待ちください・・・ @ping 192.168.1.4 | Find "% loss" > losspct.$$$ @for /F "delims=() tokens=1-2" %%a in (losspct.$$$) do @set ans1=%%b @cls @echo ping の結果:%ans1% @pause これを参考にしてみてください。 頑張ってくださいヽ(^。^)ノ

CockRobin
質問者

お礼

早速の回答、ありがとうございました。 大変参考になりました。 前回の質問の仕方で誤解があると困るので、改定していました。

関連するQ&A

  • MS-DOSのバッチファイル作成(テキストの抽出方法)について

    複数台のマシン(PC,Unix)の死活監視を行なうDOSのバッチを作成しようとしています。 バッチの内容としては、 ・管理用PCから、それぞれの監視対象マシンに対して PINGを発行し、レスポンスがあれば(0%lossの場合) OKを表示し、レスポンスが無ければ(100%lossの場  合)NGを表示するという簡単なものを考えています。 しかしながら、PINGの結果からfindでlossの行を抜き出したまでは良いのですが、"0%loss"を変数に入れて 判定するところが、うまくいきません。 ping ※※.※※※.※※.※ | find "loss" > temp.$$$ temp.$$$から"0%loss"もしくは、"100%loss"を抜き出し、変数に入れて、 if "%%a" == "(0% loss)" goto OK :OK echo OK の様にしたいと思っています。 お手数ですが、ご存知の方が居られましたら教えてください。 よろしくお願いします。

  • バッチファイルで条件によって書き出さないようにしたい

    temp.txtというファイルのカンマ4つめが同じだったらテキストに出力しないバッチファイルを作りたいと思っています。 set sbuf=test for /f "tokens=4 delims=, " %%a in (C:temp.txt) do ( set saddress=%%a if %sbuf% == %%a ( ) else ( set saddress=%%a findstr %saddress% C:\sip_cmail\ping_sip.txt >> C:\out.txt ) set sbuf=%%a ) と書いてみたのですが、動きません。 流れとしては、一巡目に通ったときの値をbufにいれておいて、二順目通ったときに比べ、同じだったら何もしないで次に行く、としたいのですが、、 括弧が何十にもなると出来ないのでしょうか。 よろしくお願い致します。

  • バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが

    バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが開けない (1)と(2)のバッチファイルを作りました。それぞれ単体で実行すると、エラーは出ません。 (1)と(2)を一緒にした(3)というバッチファイルで実行すると、FINDSTRのところで、 「ファイルを開くことができません」というエラーが出て、途中でとまってしまいます。 エラーを出さずに実行する方法は何かないでしょうか? (A.batは、CドライブにあるWord.exeを実行するだけのバッチファイルです。) どうぞよろしくお願いします。 【(3)の中身】 call A.bat >kekka.txt   ←この1行だけが(1)のバッチファイルの中身です GOTO kensaku GOTO :EOF ::文字列検索 :kensaku SET keyword=作成しました。   ←この行から下が(2)のバッチファイルの中身です FINDSTR %keyword% kensaku.txt > NUL GOTO kekka%ERRORLEVEL% GOTO :EOF :kekka0 REM 文字列あり ECHO %keyword%がありました PAUSE > nul GOTO :EOF :kekka1 REM 文字列なし ECHO %keyword%はありませんでした。 PAUSE > nul GOTO :EOF

  • バッチファイルのループ処理の質問です。

    バッチファイルのループ処理の質問です。 バッチファイルでサーバにセキュリティーパッチをインストールしたいのですが、 一件しかインストール出来ません。 ---------------------------------------------- @echo on setlocal set SrcDir=\\192.168.11.5\temp\ for %%i in (%SrcDir%*.msu) do ( %%i /quiet /norestart >>Instarll_log.log IF ERRORLEVEL 3010 GOTO ReqReboot IF ERRORLEVEL 1 GOTO NG IF ERRORLEVEL 0 GOTO OK :NG echo 異常 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :OK echo 正常 > kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :ReqReboot echo 再起動が必要 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log ) goto END :END endlocal ---------------------------------------------- 続けて次のファイルをインストールするにはどうすれば良いか 教えてください。

  • バッチファイルが動かない

    バッチ初心者です。ご教授下さい。 処理としては、特定のプロセスが存在すれば、再度5秒後にチェックして存在すればOKと表示。 としたいのですが。項番08で「0 の使い方が誤っています。」で落ちてしまいます。 ただ再チェックの項番13~20を外せば通ります。 XPで動かしています。 何が間違っているのでしょうか。宜しくお願いします。 01 @echo off 02 set tasktmp=C:\Temp\cnttmp.txt 03 set vbstmp=C:\Temp\vbstmp.vbs 04 05 tasklist | find /c "【何かプロセス】" > %tasktmp% 06 for /f %%a in (' type %tasktmp% ') do set cnttmp=%%a 07 08 if %cnttmp% neq 0 ( 09 10 echo WScript.Sleep 5000 > %vbstmp% 11 cscript //NoLogo %vbstmp% 12 13 tasklist | find /c "【上と同じプロセス】" > %tasktmp% 14 for /f %%a in (' type %tasktmp% ') do set cnttmp=%%a 15 16 if %cnttmp% neq 0 ( 17 18 echo OK 19 20 ) 21 del %vbstmp% 22 23 ) 24 del %tasktmp% 25 exit

  • バッチファイルの文字列をVBSに渡すには

    バッチファイルからVBSを実行しています。 echo msgbox "123" >> %TEMP%\abc.vbs cscript //NoLogo %TEMP%\abc.vbs >%TEMP%\abc.cmd del %TEMP%\abc.vbs call %TEMP%\abc.cmd del %TEMP%\abc.cmd このバッチを実行すると 123 が表示されます。 "123" の部分を変数として引渡したいのです。 set a=123 echo msgbox &a& >> %TEMP%\abc.vbs このようにして実行すると ’コマンドの構文が誤っています。’ となります。 よろしくお願いします。

  • バッチファイルで<&4と4<%1は何をしているの?

    MS-DOSバッチファイルで、 コマンド1 > ファイル名 2>&1 というような書き方をして、 標準出力だけでなくエラー出力もファイルに書き出すことが できることは理解しています。 そして、数値は0,1,2の3つがあり、各々、 ハンドルSTDIN(キーボード入力) ハンドルSTDOUT(コマンドプロンプトウィンドウへの出力) ハンドルSTDERR(コマンドプロンプトウィンドウへのエラーの出力) であることも理解しています。 しかし、 この数値が3以上で使用されているコードを見かけました。 例えば、 ネット上に以下のコードがあったのですが、 SET /P s1= >NUL <&4 の「>NUL」の部分は、 メッセージが画面に表示されないようにしていると思いますが、 「&4」の部分と 最後の行の4<%1の「4」の部分は何をしているのでしょうか。 実際に動かしてみると、 %1(file1.txt)ファイルの各行が、1行ずつ、 4という名前の変数(ハンドル?)に順番に入っていき、 &4の部分でそれを取り出して、 環境変数s1に代入(セット)しているように見えます。 私は、バッチファイルで、 このような(3以上の数値を使った)使用法を いままでに見たことがありませんでした。 このような使い方を詳しく解説しているサイト がありましたら教えてください。 よろしくお願いします。(Windows10) ---Paste.CMD--------------------------------- @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION (FOR /F %%0 IN ('FIND /C /V ""') DO SET a1=%%0) <%1 (FOR /F %%0 IN ('FIND /C /V ""') DO SET a2=%%0) <%2 IF %a1% LSS %a2% SET /A a1=a2 (FOR /L %%k IN (1,1,%a1%) DO ( SET s1= SET s2= SET /P s1= >NUL <&4 SET /P s2= >NUL <&5 ECHO:!s1! !s2! ) ) 4<%1 5<%2 ------------------------------------ 使用例 paste file1.txt file2.txt ------------------------------------

  • Win2003(OS⇒64bit)のバッチファイルで、下記のように環境

    Win2003(OS⇒64bit)のバッチファイルで、下記のように環境変数を設定し、比較を行なったが、ある値を超えると、うまく比較ができなくなります。環境変数に値をセットする際にオーバーフローが起きたのではないか考えています。このような制限があるのでしょうか? ※環境変数にセットできる値は(-2147483648~2147483647)の範囲内に限られるようです。 (1) set SIZE1=2387301315 set SIZE2=2387301315 SIZE1 geq SIZE2 ⇒ OK (2) set SIZE1=2387301315 set SIZE2=-1 SIZE1 geq SIZE2 ⇒ NG (3) set SIZE1=2387 set SIZE2=2400 SIZE1 geq SIZE2 ⇒ OK

  • WindowsXP 記号チェック

    いつも大変お世話になっております。 WindowsXP SP3にて下記のバッチファイルがあります。 コード------------------------------------------------------ SETLOCAL ENABLEDELAYEDEXPANSION SET DIR_LIST=D:\TEST\FINSSTR\DIR.txt SET DIR=D:\TEST\FINSSTR\DIR SET FIND_OK_LIST=D:\TEST\FINSSTR\FIND_OK.txt SET FIND_NG_LIST=D:\TEST\FINSSTR\FIND_NG.txt Dir /s %DIR%\*.txt /b > %DIR_LIST% for /f "tokens=* " %%a in (%DIR_LIST%) do call :sub "%%a" echo "処理完了" :sub for /f "delims=" %%T in (%~1) do ( set LINE=%%T findstr "○" %~1 If !errorlevel!==0 ( echo !LINE!>>%FIND_OK_LIST% ) else ( echo !LINE!>>%FIND_NG_LIST% ) ) コード------------------------------------------------------ 該当フォルダ(サブフォルダ含む)にて 【.TXT】の拡張子で"○"の記号がファイル内にあるかをサーチする バッチを作成してみました。 ○があれば、FIND_OK_LISTに ・・・なければFIND_NG_LISTに検索対象ファイル名(フルパス付き)で それぞれ出力するバッチです。 しかし実行してもうまく稼動しません。 DIR.txtまでは作成されています。 何に問題があるのでしょうか? 他のバッチ等をCALLせず、かつVBS等も使わず バッチ1本で実現したいのですが可能でしょうか? ※何かしらのソフトで実施したくもないです。 ご存知の方がいれば、ご教授願いますでしょうか? 以上、何卒宜しくお願い致します。

  • 【バッチファイル】for繰り返しがうまくいかない

    バッチファイルの置いてあるフォルダ内(ついでにサブフォルダ内も)の 特定の拡張子(今回は.txt)ファイル全てを対象に (1)ある行ある列n文字目から2文字を読み込む×2 (2)読み込んだ文字をそのファイル名の先頭に追加 というバッチファイルを作りたいです。 具体例 テキストの中身↓ a.txt ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○xx ○○yy ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... →ファイル名を「xxyya.txt」にしたい そこで素人ながら下記のようなバッチファイルを作成してみましたが、 フォルダ内にある1つ目のファイルに対してはうまく動くのですが 2つ目以降はリネーム出来ません。 フォルダ内すべての.txtファイルに実行するための 対処法がお分かりになれば、ご教授いただけると幸いです。 「rename.bat」 cd /d %~dp0 rem .txtファイルを列挙 for /f "usebackq tokens=*" %%i in (`dir /s /b *.txt`) do ( set name=%%~xni rem 特定の行列の文字列を抜き出して変数へ格納 for /f "skip=5 tokens=2,3" %%a in (%%i) do ( set front=%%a set back=%%b rem 7行目以降は不要なのでforから離脱 goto break ) :break rem 抜き出した文字列からさらに必要な文字を抜き出して変数へ set hed="%front:~2,2%%back:~2,2%" rem 元のファイル名へ追記 ren %name% %hed%%name% )