推しミネラルウォーターはありますか?

Linux の inotify と同じことを Windows でもやりたいと考えています。
http://orebibou.com/2015/04/windows
を参考にして『inotifywait.exe』を作成しました。
そして以下のようなバッチファイルを作って実験しました。
------------------------------
cd C:\cygwin64\home\user
inotifywait.exe -m sample
------------------------------
これを起動して、sampleフォルダにテキストファイルを入れると以下のように表示されます。

C:\cygwin64\home\user\sample CREATE 222.txt

inotifywait.exeがきちんと動いていることはわかるのですが、このイベントをバッチファイルで捕捉するにはどうしたらいいのでしょうか?捕捉した後である処理をさせたいのです。
シェルスクリプトでは次の様な感じでうまくいくのですが、これをバッチファイでできるのでしょうか?
------------------------------
sampledir=C:/cygwin64/home/user/sample
events=(-e create)
while C:/cygwin64/home/user/inotifywait.exe ${events[@]} $sampledir; do
php C:/xampp/htdocs/ruby/yah.php
done
------------------------------
LOOP と IF を使うのだろうと自分なりにいろいろやってみたのですがうまくいきません。
私の実験スクリプトは余りにもあてずっぽうのひどいものなので提示する勇気はありませんが、ヒントだけでも頂ければ嬉しいです。

よろしくお願いします。

A 回答 (3件)

inotifywaitのマニュアルは読みましたか?


-m とか -e とかがどんな意味だか調べましたか?


inotifywait.exe -m sample
には -m オプション(コマンドを終了しないで繰り返しイベントをチェックする) が付いています。
だからずーっと繰り返しています。

その中から、特定の行を判定して、って考えてませんか?




C:/cygwin64/home/user/inotifywait.exe ${events[@]} $sampledir
の方では、 ${events[@]} が -e create に展開されて、 createだけを検出しています。
-m が付いてないので、1つ検出できたらコマンドが終了します。

上の -m 付きとは動作が違います。



inotifywaitが終了したら、次のdo〜doneの間にある php〜が実行されます。
phpが終わったら、whileのループにより、 inotifywaitが実行開始
→ createを検出したらinotifywait が終了
→php
...
の無限ループです。


これをそのまま
:LP1
inotifywait 〜
php 〜
goto LP1

あるいは、シェルスクリプトのwhileを尊重するなら
:LWHILE
inotifywait 〜
IF %ERRORLEVEL% neq 0 THEN GOTO LWEND
php 〜
GOTO LWHILE
:LWEND
    • good
    • 0
この回答へのお礼

kmeeさん、解決できました。以下の1でも2でも目的通りに動作します。

------ 1 ------
CD C:/cygwin64/home/user/
:LOOP
inotifywait.exe -e create sample
php yah.php
goto LOOP

------ 2 ------
CD C:/cygwin64/home/user/
:LWHILE
inotifywait.exe -e create sample
IF %ERRORLEVEL% neq 0 THEN GOTO LWEND
php yah.php
GOTO LWHILE
:LWEND


最初は2のようなスクリプトを想像していました。しかし、1でも動くのは私には不思議としか言いようがありません。まるで条件分岐がないように見えます。
2の「%ERRORLEVEL% neq 0」は知らない人間には到達できないものですね。
とにかくこれでスッキリと解決しました。Windows XP には ruby を使わずこれを使うのが一番簡単ですね。
どうも、ありがとうございました。

お礼日時:2016/07/06 19:26

まずは、そのシェルスクリプトがどんな原理で動いているか、理解してみてはどうでしょう?




そのシェルスクリプトは、実質 while による無限ループになっています。
シェルスクリプトの while は
while コマンド ; do 〜 done
という形で、コマンドの終了ステータスがTRUEの間do〜doneを繰り返すというものです。

inotifywaitは、イベントが起きたら終了する。それまでは実行中のまま、というコマンドです。

while から inotifywaitが実行される→イベントが起るまでinotifywaitが待つ→イベントが起ってinotifywaitが終了→終了ステータスは正常→do〜doneが実行される→whileに戻る


となれば、バッチファイルでも inotifywait →php の無限ループにすればいいのでは
    • good
    • 0
この回答へのお礼

>となれば、バッチファイルでも inotifywait →php の無限ループにすればいいのでは

最初の質問に書きましたように、LOOPで回してその中にIFを作ればいいのではないかと思っているのですが、イベントをキャッチする方法がわからないと申し上げております。そこさえ突破すれば解決できると思っています。

最初はいろいろ試したスクリプトを質問に提示しようかとも思いましたが、どう見てもおかしいので書きませんでした。なにしろ3日前にバッチファイルを初めて触ったものですから。
普段はネット検索して自分で作るのですが、これに関しては私は見つけられませんでした。ですから、詳細なスクリプトではなくてヒントだけでもと申し上げています。

質問に答えて頂くのは有難いのですが、私の最初の質問内容から半歩も進んでおりません。

お礼日時:2016/07/06 00:03

具体的に、どのように「うまくいかない」のでしょうか?



経験上の話ですが。
Cygwin用の実行ファイルを、Windowsのコマンドプロンプトやバッチファイルで実行したときに、うまく動いてないように見えるときがあります
( 画面の文字が表示されない、等)
    • good
    • 0
この回答へのお礼

>具体的に、どのように「うまくいかない」のでしょうか?

シェルスクリプトを見て頂ければわかると思いますが、目的は「yah.php」というプログラムを起動させることです。あるフォルダを監視していて何らかの変化があった場合、それを捉えて特定のプログラムを起動させたいのです。

質問の上の方で書いたバッチファイルではファイルが作成されたことは検知されましたが、それをphpプログラムの起動に結びつけることができません。

LinuxとWindows + rubyでは出来ました。しかしネット接続されていないコンピュータ(Windows XP)で実現させたいので、バッチファイルでできればそれが一番いいのではないかと思いました。
シェルスクリプトもrubyも理解しているわけではないのですが、ネット検索して情報を集め何とか思い通りにできたのですが、バッチファイルに関しては検索してもあまり情報がなかったので質問しました。

お礼日時:2016/07/05 20:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報