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

このQ&Aのポイント
  • バッチ初心者です。バッチファイルが動かないという問題についてご教授ください。
  • 特定のプロセスが存在すれば、再度5秒後にチェックして存在すればOKと表示したいのですが、エラーが発生しています。
  • XPで動かしているのですが、何が間違っているのかわかりません。アドバイスをお願いします。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • 777_kenyu
  • ベストアンサー率68% (22/32)
回答No.1

0の使い方が誤っていますというのはC:\Temp\cnttmp.txtの中身が想定外の物になっているのだと思います。バッチファイルの多重起動などで同じファイルに同時にアクセスしてませんか? 解決策ですが、文字列を含む行数との比較ではなく、 文字列を検索した結果のerrorlevelをみてはどうでしょうか。 中間ファイルを作らなくてよくなります。 05 tasklist | find /c "【何かプロセス】" > %tasktmp% 06 for /f %%a in (' type %tasktmp% ') do set cnttmp=%%a 07 08 if %cnttmp% neq 0 (  ↓ tasklist |find "何かのプロセス" > NUL if errorlevel 1 goto skip echo WSciript.Sleep 5000 > %vbstmp% … :skip exit

wtdump
質問者

お礼

回答ありがとうございます。 errorlevel,goto で分枝させることで解決しました。 中間ファイルもなくなりシンプルに纏めることができました。 改めて見ると、ヘルプを見て解決できそうな質問でしたね。 恥ずかしい限りです。 ありがとうございました。

関連するQ&A

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

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

    以下は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

  • ファイルのバッチ処理について

    バッチ処理を勉強しているところです。 ひとつの問題が解決できていないので、わかるひとは教えて もらえませんか? C:\bom.txtがあって、C:\temp\a.txtとC:\temp\d.txt, C:\temp\a\a.txt と C:¥temp\b\e.txtもあります。 for でC:\bom.txtファイルとほかのファイルと再帰的に結合して、 ファイル名はそのままにしたいですが、 @set bomfilepath=C:\ 考えているバッチは以下のようになるが、失敗しました。 for /R %1 %%f in (*.*) do @( @rem echo %%f call copy /B %bomfilepath%bom.txt+%%f %%ftemp call del /Q %%f ren %%ftemp %%f ) 原因はどこですか?

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

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

    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にいれておいて、二順目通ったときに比べ、同じだったら何もしないで次に行く、としたいのですが、、 括弧が何十にもなると出来ないのでしょうか。 よろしくお願い致します。

  • バッチファイルについて

    バッチファイルについて バッチファイルの勉強をしておりますが、以下のバッチで 分からない箇所があります。 @echo off copy C:\bin\set.txt set.txt | find /v "コピー" echo ユーザー名を入力してください echo 入力後、Ctrlキーを押しながらZキーを押した後、Enterキー copy con inp.txt | find /v "コピー" copy set.txt+inp.txt setinp.bat | find "○○" call setinp.bat echo ユーザー名は%INP%と入力されました! del setinp.bat set.txt inp.txt <<不明箇所>> まず、C:\bin\set.txt』は set INP= とだけ書いたファイルです。 copy C:\bin\set.txt set.txt | find /v "コピー" ですが、|find /v"コピー"はなんのためにやっているのでしょうか?? find /vを調べてみると、指定した文字列を含まない行の内容をすべて画面に表示します。 と記載されていますが・・・・このバッチでは一体なぜ最初にいるのでしょう?? copy con inp.txt | find /v "コピー" ですが、コンソールから入力させた文字列をinp.txtに保存しているらしいのですが、 そのあとに、また、|find /v"コピー"がでてきますが、なぜでしょう??なにを したいのでしょう?? さらにまた、copy set.txt+inp.txt setinp.bat | find "○○"が出てきますが、 ここでなぜまた意味不明な、|find"○○"がでてくるのでしょう?? さらにさらに、バッチを実行してみると、set.txtの中身にはコンソールから 入力した文字は何も記載されていない、そして、inp.txtやsetinp.txtという テキストファイルも、どのフォルダにも出来ていません。 最後の行のdel setinp.bat set.txt inp.txtを消して実行してみても同じです。 なぜでしょう?? このバッチの動き、例としての意図が全く分かりません。。。。 この例題が悪すぎるのか、私の頭がわるすぎるのか・・・・ ちなみに、上記バッチは、http://www.geocities.co.jp/SiliconValley-SanJose/1227/batinput.html のサイトのものです。 どなたかご教授願います。。。一週間悩みましたが、まったく理解できない状態です。。。

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

  • Win2000 バッチファイルについて

    こんにちは、 Win2000の環境で下記のバッチがうまく動作できません、”FIND:パラメータ書式が間違います”というエラーが出ています、ほかの2003,2008ではそういう現象が出ていません。 なぜでしょうか? そこの”^|”の”^”を消したとしても無理のようです。 ■簡単にバッチファイルが存在する領域の使用容量を算出するバッチファイルです。(一時ファイルの生成は利用しない、Findコマンドだけを使うという前提で) ソース: @echo off for /F "tokens=3" %%s in ('dir /s/-c ^| find "個のファイル"') do Set s=%%s echo %s% 分かって頂ければご教授ください。 誠にありがとうございます~~。

  • バッチファイルの組み方について

    パソコンの起動と同時に不要なファイルを自動的に削除したいと思い、バッチファイルを組みたいのですが、分からない点があるのです。 今、 C:\Windows\Temp\*.tmp と C:\Program Files\Trend Micro\Virus Buster 2002\temp\*.tmp の2カ所に存在するtempファイルの削除をバッチファイルを組んで行いたいのです。 一つの時(上段1つの時)は autoexe.batに if exist c:\windows\temp\*.tmp del \windows\temp\*.tmp と命令文を入れて、上手くいっていたのですが、2カ所にある時の組み方が分かりません。 具体的にどの様にすれば、上手くいくでしょうか? if exist C:\Program Files\Trend Micro\Virus Buster 2002\temp\*.tmp del C:\Program Files\Trend Micro\Virus Buster 2002\temp\*.tmp ともう一行実行文を入れた場合は上手くいきませんでした。 ご存じの方、よろしくお願いいたします。

  • バッチファイル 現在のフォルダ名をファイル名に置き換える

    こんにちは。超初心者なのですが教えてください。 ある複数フォルダに格納されている.txtファイルを、現在の フォルダ名を取得して、別フォルダにリネームして 格納するバッチファイルを作成したいと考えています。 for文を繰り返し使わなければいけないことはわかっているのですが、それをどう表現していいのか全然わかりません。 例えば、 データ取得元として以下のファイルがあったら C:\temp\20100101\data1.txt C:\temp\20100101\data2.txt C:\temp\20100101\data3.txt C:\temp\20100102\data1.txt C:\temp\20100102\data2.txt C:\temp\20100103\data1.txt C:\temp\20100103\data2.txt これを別フォルダに、現在のフォルダ名をファイル名にくっつけて 以下のように一つのフォルダに纏めて格納したいと思っています。 ファイルの中身はそのままコピーしたいので、どこかでcopyコマンド を使うかもしれないです。 C:\test\data1_20100101.txt C:\test\data2_20100101.txt C:\test\data3_20100101.txt C:\test\data1_20100102.txt C:\test\data2_20100102.txt C:\test\data1_20100103.txt C:\test\data2_20100103.txt 実装方法として以下までは考えましたが、これ以上は無理そうです。 rem set A=C:\temp rem set B=C:\test for %%A in (C:\temp\) do ( if not "%%A"=="" ( pushd "%%A" for /d %%B in (*) do ( if not "%%B"=="" ( pushd "%%B" for /d %%C in (*) do ( if not "%%C"=="" ( pushd "%%C" ) ) ) ) popd? ) ) 申し訳ありませんが、お助け願います。