JScript (WSH) でフォルダ監視

JavaScript Advent Calendar の14日目の tricknotes さんが JScript を押してたので乗ってみる。JScript の難点は調べても情報が出てこないことですね。

WQL というやつの __InstanceCreationEvent を使えば特定のフォルダの中にファイルが作られたとき(移動されたときも)に何か操作をすることができるらしい。

  var computer = '.';
  var drive = 'C:';
  var path = '\\Users\\ユーザー名\\';

  var wmi = GetObject("winmgmts:\\\\" + computer + "\\root\\CIMV2");

  var wql = [
    "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE ",
    "Targetinstance ISA 'CIM_DataFile' AND ",
    "TargetInstance.Drive = '" + drive + "' AND ",
    "TargetInstance.Path = '" + path.split('\\').join('\\\\') + "'"
    ].join('');

  var eventSrc = wmi.ExecNotificationQuery(wql);

  while (true) {
    var eventObj = eventSrc.NextEvent();
    var objItem = eventObj.TargetInstance;

    // objItem.Name がファイルのフルパス。
  }
  • WITHIN は何秒間隔でポーリングするか。
    • ここでは2秒にしてある。
  • サブフォルダまでは監視してくれない。
  • ExecQuery じゃなくて ExecNotificationQuery を使うのがポイント。
  • CreationEvent の他に ModificationEvent と DeletionEvent もある。OperationEvent を使えば全部監視できる。
  • JScript のオブジェクトはほとんどのプロパティが enumerable じゃない(for(var x in ...) できない)ので、いちいち検索しないといけなくて面倒。