2010-12-29 08:06:29 +0000 2010-12-29 08:06:29 +0000
87
87

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

私は、特定のフォルダにファイルが追加されたときに、そのファイルで動作するバックグラウンドプロセスを自動的にトリガーするように、私のVistaマシン上でスクリプトのようなものを設定する必要があります。(バックグラウンドプロセスは、他のいくつかの事前定義されたオプションと一緒に引数としてファイル名を取るコマンドラインユーティリティです。)

私は、パフォーマンスとメンテナンスの理由から、可能であれば、ネイティブWindowsの機能を使用してこれを行いたいと思います。私はタスクスケジューラを使用することを検討しましたが、しばらくの間、トリガーシステムを熟読した後、私はそれの多くの意味を作ることができなかった、と私はそれが私が必要とするものを行うことができるかどうかもわからないです。ありがとうございます!(笑)

回答 (8)

96
96
96
2014-11-23 18:26:49 +0000

仕事では、フォルダの監視に Powershell を使用しています。 Windows Vista 以降(.NET と PowerShell がプリインストールされています)では、追加ツールなしで使用できます。アクションを置き換えて、外部ツールの呼び出しなど、好きなことをすることができます

ログファイルの例

11/23/2014 19:22:04, Created, D:\source\New Text Document.txt 11/23/2014 19:22:09, Changed, D:\source\New Text Document.txt 11/23/2014 19:22:09, Changed, D:\source\New Text Document.txt 11/23/2014 19:22:14, Deleted, 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. テキストファイルを新規作成します

  1. 上記のコードをコピー&ペーストする
  2. 次の設定をあなた自身のニーズに変更します:
  3. 監視するフォルダ: $watcher.Path = "D:\source"
  4. 特定のファイルタイプのみを含むようにファイルフィルタ: $watcher.Filter = "*.*"
  5. サブディレクトリを含む yes/no: $watcher.IncludeSubdirectories = $true
  6. 保存して StartMonitoring.ps1 に名前を変更する 5.監視を開始するには、右クリック “ PowerShell で実行する

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

続きを読む

6
6
6
2010-12-29 08:49:30 +0000

あなたは正しい行にいるように見えます - あなたはタスクスケジューラを使用して定期的に.batまたは.cmdファイルを実行し、そのファイルは必要なファイルの存在をチェックするための行で始まることができます - 実際、私はファイルが存在しないかどうかをチェックします。 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秒)の遅延で実行され、あなたは、バッチファイルのループの間に必要な遅延を達成するためにこれらの値を再生することができます。

4
4
4
2011-01-07 04:01:48 +0000

結局、フォルダをポーリングするという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の答えを感謝としてupvoteしました!)

3
3
3
2016-11-30 09:15:20 +0000

アクションが変更されたファイルをコピーするだけならば、 robocopy /MON

を使うことができます。

2
2
2
2011-03-12 13:01:15 +0000

もしくは、 Watch 4 Folder を使うのもいいかもしれません。どうやらフリーウェアで、ポータブルで、Windows7と互換性があるらしい。私は試していませんが、ネット検索で見つけたので載せておこうと思いました。

2
2
2
2016-05-16 17:14:11 +0000

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

2
2
2
2017-12-20 02:16:44 +0000

また、かなり大きそうなwatchmanと、試していない小さいwatchexecも見つけました。パワーユーザー向けのCLIユーティリティ。

1
1
1
2016-04-14 08:34:08 +0000

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

関連する質問

3
19
10
28
11