![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドラインの生成でParse e...
-
phpからエクセルのマクロを実行...
-
copy() で属性保存
-
mysql複数レコードをまとめて削...
-
Prompt入力値をphp変数として取...
-
PHPでサーバーにインストールさ...
-
ヒアドキュメントの中で演算子...
-
JSのWINOW.CONFI...
-
PHP5で名前空間を取り扱う
-
PHPとfortran
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
PHPのif文でその処理を途中で抜...
-
3つ以上の論理積は利用可能なの...
-
PHPファイルの中身が見られるこ...
-
ファイル名は、数字の「0」(...
-
VBSの「MsgBox」について
-
FTP接続の例外処理
-
透過PNGが透過されない!!
-
.phpと.incファイルの違いはな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ヒアドキュメントの中で演算子...
-
PHPからバッチファイルの実行
-
mysql複数レコードをまとめて削...
-
PHPでサーバーにインストールさ...
-
Switch文における、returnとbre...
-
PHPでコマンドプロンプトを実行...
-
【PHP】命令は記述順に処理...
-
phpからエクセルのマクロを実行...
-
PHPで、C#のプログラムを実行す...
-
別サーバのプログラムを起動
-
JSのWINOW.CONFI...
-
htmlでsubmitで指定したAction...
-
PHPで外部プログラムのバックグ...
-
require_onceが動いていない
-
systemをrootで実行したい
-
PHPからlhaコマンドを使いたい
-
phpスクリプトのみで定期実行
-
シェルスクリプトをPHPで動かそ...
-
php実行中に実行中のphpファイ...
-
PHPでUNIXシステムコマンド...
おすすめ情報