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 ...) できない)ので、いちいち検索しないといけなくて面倒。
- objItem の .Name 以外のプロパティはこんな感じ→CIM_DataFile class - Windows applications | Microsoft Docs