ファイルが作成または編集されたときにフォルダーを監視し、コマンドラインアクションをトリガーする方法


82

Vistaマシンで何らかのスクリプトを設定する必要があります。これにより、ファイルが特定のフォルダーに追加されるたびに、そのファイルで動作するバックグラウンドプロセスが自動的にトリガーされます。(バックグラウンドプロセスは、ファイル名を引数として使用するコマンドラインユーティリティであり、他の定義済みオプションもあります。)

パフォーマンスとメンテナンスの理由から、可能であればネイティブのWindows機能を使用してこれを実行したいと思います。タスクスケジューラの使用を検討しましたが、しばらくの間トリガーシステムを熟読した後、それをあまり理解できず、必要なことを実行できるかどうかさえわかりません。

提案をお願いします。ありがとう!


Linuxのinotifyのように考える必要があるように聞こえますが、Windows用です。Jnotifyは役立つかもしれませんが、Java なので重量が重すぎる可能性があります。
キース

1
私もこれについて疑問に思っていました... [MSDNページ](msdn.microsoft.com/en-us/library/aa365261 ( VS.85).aspx)が見つかりました。
キース

2
aspxの後に上記のリンクあり):msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

回答:


92

職場では、Powershellを使用してフォルダーを監視します。
Windows Vista(.NETおよびPowerShellがプリインストールされている)であるため、追加のツールなしで使用できます。

このスクリプトは、特定のフォルダーを監視し、ログファイルを書き込みます。アクションを置き換えて、外部ツールを呼び出すなど、必要な操作を実行できます。

ログファイルの例

11/23/2014 19:22:04、作成、D:\ source \ New Text Document.txt
11/23/2014 19:22:09、変更、D:\ source \ New Text Document.txt
11/23/2014 19:22:09、変更、D:\ source \ New Text Document.txt
11/23/2014 19:22:14、削除、D:\ source \ New Text Document.txt

StartMonitoring.ps1

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "D:\source"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\log.txt" -value $logline
              }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    Register-ObjectEvent $watcher "Changed" -Action $action
    Register-ObjectEvent $watcher "Deleted" -Action $action
    Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 5}

使い方

  1. 新しいテキストファイルを作成する
  2. 上記のコードをコピーして貼り付けてください
  3. 次の設定を必要に応じて変更します。
    • 監視するフォルダー: $watcher.Path = "D:\source"
    • 特定のファイルタイプのみを含めるファイルフィルター: $watcher.Filter = "*.*"
    • サブディレクトリを含むyes / no: $watcher.IncludeSubdirectories = $true
  4. 保存して名前を変更します StartMonitoring.ps1
  5. 右クリックで監視を開始»PowerShellで実行

監視を停止するには、PowerShellウィンドウを閉じるだけで十分です。

参考文献


うまく動作しますが、停止スクリプトの機能は何ですか?エラーが発生します:「Unregister-Event:引数 'SourceIdentifier'がnullであるため、引数にバインドできません。」pastebin.com/ugLB3a69
ヤンStanstrup

@JanStanstrup 2番目のスクリプトでもっと多くの人を混乱させたでしょう。削除します。StartWatching.ps1ウィンドウを閉じるだけで監視を停止できます。あなたが最初のスクリプトでそれを含める場合は、2番目のスクリプトは変数だけを保存するために働くん$created$changed$deletedまたは$renamed
nixda

答えてくれてありがとう。私が変更されたときにgithubのにファイルをアップロードしたいと我々はCMDプロンプトを使用することができれば誰でも提案することができます
m__

5

あなたは正しい行にいるようです-タスクスケジューラを使用して定期的に.batまたは.cmdファイルを実行でき、そのファイルは必要なファイルの存在を確認する行で開始できます-実際、ファイルが存在しないことを確認します。例えば:

@ECHO OFF
REM Example file
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS EXIT 1
REM All this gets done if the file exists...
:
:
EXIT 0

また、このコードを変更し、ループで1分間の遅延でループで実行してから、Windowsスタートアップフォルダーにバッチファイルへの参照を配置することもできます。

@ECHO OFF
REM Example file
:LOOP    
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS GOTO SKIP01
REM All this gets done if the file exists...
:
:
:SKIP01
REM Crafty 1 minute delay...
PING 1.1.1.1 -n 10 -w 6000 >NUL
GOTO LOOP

実行中のWindowsのバージョンとインストールされている追加のリソースキットに応じて遅延を実現する方法は他にもありますが、PINGコマンドはすべての状況でほとんど機能します。上記のPINGコマンドでは、10個のファントムPINGSが6000ms(つまり、6秒)の遅延で実行されます。これらの値を使用して、バッチファイルループ間で必要な遅延を実現できます。


良いアイデア..ところで、C:\> ping 1.1.1.1 -n 10 -w 6000なんらかの理由で私のコンピューターでは1分10秒かかりました。しかし、-n 1 -w 60000は正確に1分かかりました。
barlop

@barlop-10秒の不一致は-n 10vs によるもの-n 1です。

@Randolph Potter 10ロットの6秒、60秒ではありませんか?使用する-n 10は、10回を意味します。
barlop

あなたはおそらく正しいです。私はそれを取り戻し、私の金髪を責めます。

私はこのループを監視バッチに使用することになりましたIF NOT EXIST C:\NO_SUCH_FILE_EVER.foo。ハックが、それは動作します。アイデアをありがとう。
スネクセ

3

提案をありがとう。

最終的に、フォルダーをポーリングし、タスクスケジューラを使用して起動時に実行するというLinker3000のアイデアに基づいたVBScriptを作成しました。最終的にこのリソースから基本的な構文を取得し、必要な調整を行いました。

スクリプトの根性をイベント駆動型システムで実行するように、いつか最適化したいのですが、時間をかけて作業する必要があります。これで十分です。

誰かが興味を持っている場合のスクリプトは次のとおりです(わかりやすくするために無関係な変換セグメントが編集されています)。

' FOLDER TO MONITOR
strFolder = "J:\monitored-folder"

' FREQUENCY TO CHECK IT, IN SECONDS
nFrequency = 10

strComputer = "."
strQueryFolder = Replace(strFolder, "\", "\\\\")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" &     strComputer & "\root\cimv2") 
Set colMonitoredEvents = objWMIService.ExecNotificationQuery ("SELECT * FROM __InstanceCreationEvent WITHIN " & nFrequency & " WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent='Win32_Directory.Name=""" & strQueryFolder & """'") 

Do 
    Set objLatestEvent = colMonitoredEvents.NextEvent
    strNewFile = objLatestEvent.TargetInstance.PartComponent
    arrNewFile = Split(strNewFile, "=")
    strFilePath = arrNewFile(1)
    strFilePath = Replace(strFilePath, "\\", "\")
    strFilePath = Replace(strFilePath, Chr(34), "")
    strFileName = Replace(strFilePath, strFolder, "")
    strTempFilePath = WScript.CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) & "\TEMP.M4A"

    ' DO THE OPERATION STUFF
    ' ...
Loop

(また、この質問を公式に未回答のままにしたくありません-そして、私は質問に対する自分の回答を受け入れたくありません-しかし、私は感謝としてLinker3000の回答に賛成しました!)


2

DropIt(無料)をご覧ください。このプログラムは、自動化された方法で着信ファイルを処理するのに適しています。パラメータを移動、コピー、削除し、他のコマンドラインプログラムに渡して、画像の変換、PDFの分割などを行うことができます。


2

アクションが変更されたファイルをコピーするだけの場合は、robocopy / MONを使用できます

robocopyがFileSystemWatcherを使用するか、変更をポーリングすることで機能するかどうかわからない


1

または、Watch 4 Folderを使用できます。どうやら、それはフリーウェアで、移植性があり、Windows 7と互換性があります。試したことはありませんが、Web検索で見つけて、それを渡すと思いました。

サイトにも掲載されているVBSスクリプトも気に入っています。


残念ながら、有料版のみが移植可能です
-nixda

このソフトウェアの使用を考えていました。多くのユーザーからの重要なファイルを使用してネットワーク共有を監視すると信頼しますか?
ポールマシューズ

Watch4Folderの無料バージョンには、設定可能な「サンプル」エントリが1つしかありません。
PeterCo


0

これを行うには、http://www.myassays.com/folder-pollの商用ツール(無料ではない)Folder Pollを使用します。これは、簡単な構成を可能にする使いやすいマネージャーアプリケーションを含むWindowsアプリケーションです。また、XML構成オプションがあります。実際のフォルダポーリングはWindowsサービスとして実行されます(したがって、再起動するたびに自動的に開始されます)。ポーリングされたフォルダーで新しいファイルが検出されると、アプリケーションを自動的に起動できます(独自のカスタムコマンドライン引数を指定できます)。ファイルのコピー/移動などの他のこともできます。また、アクティビティはログファイルに記録できますが、他にも高度な操作があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.