Robocopy
ソース ディレクトリを監視し、変更のあるファイルをコピーするオプションがあります。コピーする前にディレクトリ内で必要な変更の数 (変更の数) と、再スキャンの前に待機する時間 (/mon n
待機時間は分単位) を指定できます。n
/mot t
t
スキャンするファイルは 1 つだけなので、フォルダーをほぼ継続的に監視し、変更は基本的に瞬時に行われるようにしたいのですが、どうやら robocopy で 1 分未満の時間範囲を監視することはできないようです。試してみました/mot 0.5
が、失敗しました。また、試してみました/mot 0
が、robocopy は 1 回のスキャン後に終了し、継続的に監視することはありませんでした。
robocopy でフォルダーをほぼ継続的に、1 分未満の時間間隔でスキャンするにはどうすればよいでしょうか。あるいは、ファイル ソースを継続的に監視し、変更をリアルタイムでコピーできる他のコマンド ライン ツールはありますか。
答え1
/mot:<M>
Monitors source, and runs again in M minutes if changes are detected.
引数として受け入れられるのは分単位だけなので、強制的に実行頻度を上げることはできないと思います。ただし、バッチ ファイルを使用して実行し、タイミングとループを robocopy 内ではなくバッチ ファイル内またはスケジュールされたタスク内で実行することはできます。
答え2
タグには、Windows 8 を使用していると記載されています。これは良いことです。PowerShell という優れたツールと、 という便利な小さなコマンドレットがあるからですRegister-ObjectEvent
。
テキスト ファイルを作成し、拡張子を に変更して.ps1
、以下のスクリプトをファイルに貼り付けます。$watchedFolder
変数を監視対象のフォルダーに変更します。Do-Something 関数を変更して、robocopy コマンドなどを含めます。スクリプトを実行します。スクリプトが実行されている限り、監視対象のフォルダーでファイルまたはフォルダーが変更されるたびに、その関数が (ほぼ瞬時に) 実行されます。
このスクリプトを Windows の起動時に実行し、タイマーを使用せずに常にバックグラウンドで実行することができます。
$block = {
function Do-Something
{
param ($message, $event)
# function to call when event is raised
# do a robocopy or whatever
Start-Process cmd.exe "/C echo $("{0} {1}" -f $event.SourceEventArgs.FullPath, $message)&pause"
}
$watchedFolder = "C:\Users\Admin-PC\Desktop"
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $watchedFolder
Register-ObjectEvent -InputObject $watcher -EventName Created -SourceIdentifier File.Created -Action { Do-Something "Created" $event }
Register-ObjectEvent -InputObject $watcher -EventName Deleted -SourceIdentifier File.Deleted -Action { Do-Something "Deleted" $event }
Register-ObjectEvent -InputObject $watcher -EventName Changed -SourceIdentifier File.Changed -Action { Do-Something "Changed" $event }
Register-ObjectEvent -InputObject $watcher -EventName Renamed -SourceIdentifier File.Renamed -Action { Do-Something "Renamed" $event }
}
$encodedBlock = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($block))
Start-Process PowerShell.exe -verb Runas -argumentlist '-WindowStyle Hidden', '-NoExit', '-EncodedCommand', $encodedBlock
実際に動作を見てみましょう
保存したスクリプトを実行します。
コンソール ウィンドウが点滅し、閉じた後は、実行中であることを示す唯一の表示は、いくつかの新しいプロセスになります。
デスクトップでいくつかの操作を行ってテストします。
- 作成した PowerShell プロセスを実行する必要がなくなったら、終了します。
背景情報- この回答で使用されているツールに詳しくない場合。
- 詳細については
System.IO.FileSystemWatcher
、MSDNページ。 - PowerShellのイベントのその他の例については、こちらをご覧ください。役に立ったブログ。
- Windows PowerShellの入門書として私が見つけたのはこのサイトは役に立つ(私は彼らのその日のヒントが好きです)。
- 古いバージョンのWindowsを使用している場合、または何らかの理由でPowerShellがインストールされていない場合は、Windows 管理フレームワーク 4.0。
答え3
同期は、ハードディスク、フロッピー ディスク、LAN、USB キー、CD-DVD (パケット書き込みソフトウェアを使用)、FTP サーバー上の 2 つ以上のフォルダーを定期的に同期できるスタンドアロン ユーティリティです。質問の内容とはまったく異なりますが、私が見つけた中で最も近いものです。
私も Robocopy の 1 分間の最小時間に対する解決策を探していて、この 2 年前の質問を見つけました。結局、このソフトウェアを勧められて、それを使用しています。念のため言っておきますが、私はこのソフトウェアとは何の関係もありません。
長所:
- リアルタイム同期機能があります。
- 複数のフォルダー ペアを追加し、その横にあるチェックボックスを使用して、特定の時点でアクティブにするペアを選択できます。
- インストーラーなし、スタンドアロン プログラムです。
- 「フィルター」ボタンをクリックすると、パターンまたは変更時間によってファイルを除外したり含めたりすることができます。
- (その他、下のスクリーンショットを参照してください。チェックボックスとボタンには追加のヘルプツールヒントがあります。)
短所:
- GUIユーティリティであり、コマンドラインスイッチは使用できません。
- フォルダペアはすべて同じ設定を共有します
リアルタイム同期オプションは、スクリーンショットの「特別なオプション」セクションにマークされています。これが、質問で目標として説明されているものと思われます。このオプションがチェックされておらず、タイマーが設定されていない場合は、「同期」ボタンをクリックして 1 回限りの同期を開始できます。
2 つのフォルダーを同期する方法:
- 左上隅の参照ダイアログを使用して、監視するソース フォルダーを選択します。
- 右上隅で、変更をコピーする宛先フォルダーを選択します。
- (オプション) 参照ダイアログを使用せずにフォルダー パスを手動で入力した場合は、上部の 2 つのボックスの間にある [テスト] ボタンをクリックして、それらのフォルダーが実際に存在するかどうかを確認します。また、ほとんどの場合、[フォルダーが存在しない場合は作成する] をオンにして、新しいフォルダーがコピーされるようにする必要があります。これは、デフォルトではチェックされていないため、プログラムはデフォルトでファイルのみをコピーします。
- 「リアルタイム同期」チェックボックスをオンにします。同期がアクティブになり、左側のフォルダーのすべての変更が右側のフォルダーにコピーされます。
これも見つけたYouTube動画、ソフトウェアの動作を示します。古いバージョンが表示され、オプションは同じ場所にありませんが、ソフトウェアがどのように動作するかを知ることができます。
答え4
/MON 1スイッチを使用すると、ファイルが変更されるたびにrobocopyが同期します。