• 締切済み

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 の様にしたいと思っています。 お手数ですが、ご存知の方が居られましたら教えてください。 よろしくお願いします。

みんなの回答

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

「0%」も「100%」も、「0%」という部分を持っていますので、判定するなら 「100%ならばNG」のようにしないとダメじゃないですか? はずしてたらごめんなさい。

CockRobin
質問者

お礼

早速の回答、ありがとうございました。 また、テキスト(temp.$$$)からの抽出方法について、更なるアドバイスがございましたら、お願いします。 ちなみに、 for /F "tokens=* delims=" %%a ..... set words=%%A:~43,7% のような感じで抽出しようとしています。

関連するQ&A

  • 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 の様にしたいと思っています。 (上記では、うまくいきません。) お手数ですが、ご存知の方が居られましたらご教示ください。 よろしくお願いします。

  • バッチファイルの文字列を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 このようにして実行すると ’コマンドの構文が誤っています。’ となります。 よろしくお願いします。

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

    バッチ初心者です。ご教授下さい。 処理としては、特定のプロセスが存在すれば、再度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

  • PING一斉送信(Win98で)

    Windows98上でPINGを一斉送信するバッチを作成しています。 いろいろなサイトを見て、手元のXPで以下のバッチを作成し実行するとうまく動作しました。しかし98上で動かしてみたところ、なぜか無限ループになってしまいました。 ----------------------------------------------- @cls @echo PCの応答を調べます。 @ping -n 1 -l 8 192.168.11.5>address.txt @find /c "Request timed out." address.txt>nul @if errorlevel 1 goto A1 @if errorlevel 0 goto A0 @goto END @:A1 @echo 自分のPC:OK @goto END @:A0 @echo 自分のPC:NG @:END @pause (あとはこれは端末の分だけコピペする) ------------------------------------------------ どのようにすれば98上で動くか教えていただくと助かります。よろしくお願いします。

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

    バッチファイルのループ処理の質問です。 バッチファイルでサーバにセキュリティーパッチをインストールしたいのですが、 一件しかインストール出来ません。 ---------------------------------------------- @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 ---------------------------------------------- 続けて次のファイルをインストールするにはどうすれば良いか 教えてください。

  • バッチファイルでOUTLOOKのデータをバックアップするには?

    Q:バッチファイルでOUTLOOKのデータをバックアップするには?  職場の異動でPCのデータを引っ越すことになりました。 その際、アウトルックのデータを持っていくのですが、ついでに簡単にバックアップもできるようにとバッチファイルを組んでみましたが、うまく行きません。 MS-DOSの時代以来ですのでWINDOWSでの変数などよくわかりません。 下記のファイルで訂正箇所があれば教えていただけますでしょうか? ------------------------------ echo off cls echo: echo アウトルックのデータを[c:\temp\outlook\]にバックアップします。 pause c: cd\ md c:\temp md c:\temp\outlook copy %USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook\*.* c:\temp\outlook\*.* pause ------------------------------

  • バッチファイルでの%を含むファイル名の取得

    以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。 @echo off pushd E:\ for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j" exit /b :sub echo /////////////////////////////////////////////////////////////////////////// for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x echo %1 echo jpg %jpg_c% echo png %png_c% echo bmp %bmp_c% echo JPG %jpg2_c% goto :EOF :jpg set jpg_c=%1 :echo %1 goto:EOF :jpg2 set jpg2_c=%1 :echo %1 goto:EOF :png set png_c=%1 :echo %1 goto:EOF :bmp set bmp_c=%1 :echo %1 goto:EOF :all set all_c=%1 :echo %1 goto:EOF

  • バッチファイルで常に最新の現在時刻を表示したい

    バッチファイルで最新の現在時刻を表示したいのですが、うまく行きません。 そのバッチファイル自体を実行した時刻ではなく、そのバッチファイル内のコマンド等を実行した時刻を表示させたいのです。つまりどんどん時間を最新に近いものに更新させていって欲しいのです。 タスクスケジューラのようなものをバッチファイルで作りたくて、現在時刻が○○時であればこのコマンドを実行する、といったことがしたい訳です。 バッチファイルは実行してすぐ終了するのではなく、そのまま常駐するような形を想定しています。 なにか良い方法はないでしょうか。 ■ 5秒おきに現在時刻を表示するバッチファイルの例 (同じ時刻になってしまう) @echo off :start set time=%time: =0% echo . echo . echo .「現在時刻は%time:~-11,2%時%time:~-8,2%分%time:~-5,2%秒です。」 echo . echo . ping localhost -n 5 goto start

  • シェルを用いて死活監視

    Ubuntu9.04を使用しています。現在、このUbuntuマシン上から、他のサーバの死活監視を行いたいと考えています。そして、死活監視の結果、サーバが死んでいる場合は、Ubuntuマシンに直接USB接続されている、別の機器(ブザー、点滅ライトなど)を作動させて死んでいることを見えるようにしたいと思っています。そこで、Ubuntuマシン上で、Pingを含んだシェルを書くことを考えています。このシェルを書くという方法は、手間やミスの可能性を考えて合理的でしょうか。もし合理的であるならば、「死活監視+死んでいたときの別の機器作動」を実現するために、どのようなシェルを書けばよいのかご教示頂けると幸いです。また、合理的でない場合、フリーのソフトウェアなどございましたら、ご教示下さい。個人的には、ソフトを使って実現出来るのであれば、手間がかからなくて良いかなと思っています(笑)

  • バッチファイルで<&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 ------------------------------------