windows – ファイルが作成または編集されたときにフォルダを監視し、コマンドラインアクションを起動するには?

automation scheduled-tasks windows windows-vista

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

パフォーマンスとメンテナンス上の理由から、できればWindowsのネイティブ機能を使ってやりたいと思っています。タスクスケジューラの利用を検討したが、しばらくトリガーシステムを熟読してみても、あまり意味がわからず、必要なことができるのかどうかもわからない

何かご提案があればよろしくお願いしますありがとうございます!

  96  bigmattyh  2010-12-29


ベストアンサー

仕事ではフォルダの監視に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. 新しいテキストファイルを作成します
  2. 上記のコードをコピー&ペーストしてください
  3. 以下の設定を自分のニーズに合わせて変更してください
    • フォルダーで監視します。$watcher.Path = "D:\source"
    • ファイルフィルタで特定のファイルタイプのみを含めるようにします。$watcher.Filter = "*.*"
    • サブディレクトリをインクルードします。$watcher.IncludeSubdirectories = $true
  4. 保存して、StartMonitoring.ps1に名前を変更します
  5. PowerShell で実行」を右クリックして監視を開始します

モニタリングを停止するには、PowerShell ウィンドウを閉じるだけで十分です

Further reading

104  nixda  2014-11-23


タスクスケジューラを使って定期的に.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 個のファントム PING が 6000ms (つまり 6 秒) の遅延で実行されていますが、バッチファイルのループの間に必要な遅延を達成するためにこれらの値で遊ぶことができます

6  Linker3000  2010-12-29


皆さん、ご指摘ありがとうございます

結局、フォルダをポーリングし、タスクスケジューラを使って起動時に実行させるという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さんの回答をお礼としてアップしておきました!)

6  bigmattyh  2011-01-07


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

3  Sun  2016-05-16


変更されたファイルをコピーするだけならば、 robocopy /MON を使うことができます

ロボコピーがFileSystemWatcherを使っているのか、変更をポーリングしているのかはわかりません

3  weberjn  2016-11-30


また、watchmanはかなり大きいようで、小さいwatchexecは試していません

Watchmanはプログラム的にもいい感じ。パワーユーザーのためのCLIユーティリティ

3  Pysis  2017-12-20


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

サイトでも紹介されているVBSのスクリプトも好きです

1  Chris  2011-03-12


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

0  Mister Cook  2016-04-14


タイトルとURLをコピーしました