web-dev-qa-db-ja.com

ファイルの作成時または編集時にフォルダを監視してコマンドラインアクションを起動する方法

私は自分のVistaマシンにある種のスクリプトを設定する必要があります。そうすれば、ファイルが特定のフォルダに追加されたときはいつでも、それはそのファイルに作用するバックグラウンドプロセスを自動的に引き起こします。 (バックグラウンドプロセスは単なるコマンドラインユーティリティで、ファイル名を引数として受け取ります。その他の定義済みオプションもあります。)

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

私はどんな提案にも感謝します。ありがとうございます。

75
bigmattyh

提案をありがとう。

私は結局、Linker3000のフォルダをポーリングし、タスクスケジューラを使って起動時に実行させるという考え方に基づいたVBScriptを書きました。私は this resource から基本的な構文を得て、必要な調整をしました。

スクリプトの中身をイベント駆動型システム上で実行するようにして、まだ最適化したいと思っていますが、作業に間に合わなくて十分です。これで十分です。

これは、誰かが興味を持った場合のためのスクリプトです(明確にするために無関係の変換セグメントが削除されています)。

' 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の回答を感謝しました!)

3
bigmattyh

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

このスクリプトは特定のフォルダを監視し、ログファイルを書き込みます。あなたはアクションを置き換えて、あなたが望むことをすることができます例えば外部ツールを呼び出す

ログファイルの例

 11/23/2014 19:22:04、作成、D:\ source\New Text Document.txt [11:23] 2014/11/23 19:22:09、変更、D:\ source\New Text Document.txt 
 2014/11/23 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ウィンドウを閉じるだけで十分です。

参考文献

86
nixda

あなたは正しい行にいるように見えます - あなたは定期的に.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秒)の遅延を持って実行されます、あなたはバッチファイルループ間に必要な遅延を達成するためにこれらの値で遊ぶことができます。

5
Linker3000

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

2
Sun

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

RobocopyがFileSystemWatcherを使用するのか、それとも変更をポーリングすることで機能するのかわからない

2
weberjn

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

私もVBSスクリプトが好きで、このサイトにも掲載されています。

1
Chris

かなり大きいと思われる watchman 、および小さい watchexec も見つかりました。私は試していません。

1
Pysis

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

0
Mister Cook