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 を使うのだろうと自分なりにいろいろやってみたのですがうまくいきません。
私の実験スクリプトは余りにもあてずっぽうのひどいものなので提示する勇気はありませんが、ヒントだけでも頂ければ嬉しいです。
よろしくお願いします。
No.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
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 を使わずこれを使うのが一番簡単ですね。
どうも、ありがとうございました。
No.2
- 回答日時:
まずは、そのシェルスクリプトがどんな原理で動いているか、理解してみてはどうでしょう?
そのシェルスクリプトは、実質 while による無限ループになっています。
シェルスクリプトの while は
while コマンド ; do 〜 done
という形で、コマンドの終了ステータスがTRUEの間do〜doneを繰り返すというものです。
inotifywaitは、イベントが起きたら終了する。それまでは実行中のまま、というコマンドです。
while から inotifywaitが実行される→イベントが起るまでinotifywaitが待つ→イベントが起ってinotifywaitが終了→終了ステータスは正常→do〜doneが実行される→whileに戻る
となれば、バッチファイルでも inotifywait →php の無限ループにすればいいのでは
>となれば、バッチファイルでも inotifywait →php の無限ループにすればいいのでは
最初の質問に書きましたように、LOOPで回してその中にIFを作ればいいのではないかと思っているのですが、イベントをキャッチする方法がわからないと申し上げております。そこさえ突破すれば解決できると思っています。
最初はいろいろ試したスクリプトを質問に提示しようかとも思いましたが、どう見てもおかしいので書きませんでした。なにしろ3日前にバッチファイルを初めて触ったものですから。
普段はネット検索して自分で作るのですが、これに関しては私は見つけられませんでした。ですから、詳細なスクリプトではなくてヒントだけでもと申し上げています。
質問に答えて頂くのは有難いのですが、私の最初の質問内容から半歩も進んでおりません。
No.1
- 回答日時:
具体的に、どのように「うまくいかない」のでしょうか?
経験上の話ですが。
Cygwin用の実行ファイルを、Windowsのコマンドプロンプトやバッチファイルで実行したときに、うまく動いてないように見えるときがあります
( 画面の文字が表示されない、等)
>具体的に、どのように「うまくいかない」のでしょうか?
シェルスクリプトを見て頂ければわかると思いますが、目的は「yah.php」というプログラムを起動させることです。あるフォルダを監視していて何らかの変化があった場合、それを捉えて特定のプログラムを起動させたいのです。
質問の上の方で書いたバッチファイルではファイルが作成されたことは検知されましたが、それをphpプログラムの起動に結びつけることができません。
LinuxとWindows + rubyでは出来ました。しかしネット接続されていないコンピュータ(Windows XP)で実現させたいので、バッチファイルでできればそれが一番いいのではないかと思いました。
シェルスクリプトもrubyも理解しているわけではないのですが、ネット検索して情報を集め何とか思い通りにできたのですが、バッチファイルに関しては検索してもあまり情報がなかったので質問しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
htmlでsubmitで指定したAction...
-
Prompt入力値をphp変数として取...
-
別サーバのプログラムを起動
-
mysql複数レコードをまとめて削...
-
PHPで外部プログラムのバックグ...
-
初めて投稿させていただきます。
-
PHPで、C#のプログラムを実行す...
-
PHPからexecを使ってGnuPGを実...
-
httpdのプロセスが自動で消えな...
-
PHPからシェルコマンドの実行
-
PHPでCRON設定編集フォーム
-
PHPでrsyncを実行したい
-
Switch文における、returnとbre...
-
CSV出力にHTMLが入ってしまう
-
PHPのif文でその処理を途中で抜...
-
拡張子php画像をjpg画像等に変...
-
.phpと.incファイルの違いはな...
-
onedrive にexcelファイルをア...
-
トランザクションが原因?DBに...
-
zip圧縮の種類について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
phpからエクセルのマクロを実行...
-
mysql複数レコードをまとめて削...
-
Switch文における、returnとbre...
-
httpdのプロセスが自動で消えな...
-
php実行中に実行中のphpファイ...
-
copy() で属性保存
-
PHPでサーバーにインストールさ...
-
PHPでUNIXシステムコマンド...
-
phpをインストールしたのにブラ...
-
PHPのsystem()でjava
-
PHPからバッチファイルの実行
-
コマンドラインの生成でParse e...
-
query、prepare、executeの違い
-
ヒアドキュメントの中で演算子...
-
社内LANで複数台のPCからApache...
-
別サーバのプログラムを起動
-
JSのWINOW.CONFI...
-
PHPで実行中の行番号を取得したい
-
Prompt入力値をphp変数として取...
-
phpでアクセス権の設定
おすすめ情報