Windowsでファイルの変更を監視して何かタスクを実行したい


例えば、SassやCoffeeScriptのファイル保存時のコンパイルなどを想定していますが、できるだけ特定の実行環境(Nodeとか)に依存せず、導入が簡単なものが望ましいです。  
OSデフォルトの機能だけで実現できればそれが一番よいです。

WindowsのバージョンはVista(Server
2008)以降を想定しています。特定のバージョンのみで動作する場合には、その旨記載していただければ有難いです。




確認まではしていませんが、Vista 以降でしたら`System.IO.FileSystemWatcher`を
powershellから使えるかもしれません。 参考までに同期処理だと以下の様になります。 （ WaitForChanged 中は ctrl-C
で止まらないので、ウィンドウを閉じるか、ctrl-cを押したのち、監視対象のファイルなどの変更を行ってください ）

実際には非同期処理の方がいいかと思います。

[code]

    $w = New-Object System.IO.FileSystemWatcher
    $w.Path = "c:\\path\\to\\dir"
    $w.Filter = "*.*"
    $w.NotifyFilter = [System.IO.NotifyFilters]::LastWrite
    
    while(1){
    
      $changeResult = $w.WaitForChanged([System.IO.WatcherChangeTypes]::All)
      # $changeResult.TimeOut が trueなら、タイムアウト
    
      # 好みのコマンドを実行する。
      .\run_something.bat  $changeResult.Name
    
    }
    
[/code]




確認まではしていませんが、Vista 以降でしたら`System.IO.FileSystemWatcher`を
powershellから使えるかもしれません。 参考までに同期処理だと以下の様になります。 （ WaitForChanged 中は ctrl-C
で止まらないので、ウィンドウを閉じるか、ctrl-cを押したのち、監視対象のファイルなどの変更を行ってください ）

実際には非同期処理の方がいいかと思います。

[code]

    $w = New-Object System.IO.FileSystemWatcher
    $w.Path = "c:\\path\\to\\dir"
    $w.Filter = "*.*"
    $w.NotifyFilter = [System.IO.NotifyFilters]::LastWrite
    
    while(1){
    
      $changeResult = $w.WaitForChanged([System.IO.WatcherChangeTypes]::All)
      # $changeResult.TimeOut が trueなら、タイムアウト
    
      # 好みのコマンドを実行する。
      .\run_something.bat  $changeResult.Name
    
    }
    
[/code]

