9

Robocopy имеет возможность контролировать исходный каталог и копировать любые файлы, которые имеют изменения. Вы можете указать, сколько изменений в каталоге должно произойти перед копированием (/mon n где n - количество изменений) и сколько времени ждать до повторного сканирования (/mot t где t - время ожидания в минутах).

Я хотел бы отслеживать папку почти непрерывно, так как я сканирую только 1 файл, и я хочу, чтобы изменения были в основном мгновенными. Хотя я не могу сделать монитор Robocopy менее, чем за одну минуту. Я пробовал /mot 0.5 и это не удается. Я также попытался /mot 0 и robocopy просто выходит после сканирования один раз, без постоянного мониторинга.

Как сделать робокопию сканирования папки почти непрерывно, с шагом менее 1 минуты? В качестве альтернативы, есть ли другой инструмент командной строки, который может постоянно отслеживать источник файла и копировать изменения в режиме реального времени?

3 ответа3

11

В ваших тегах указано, что вы используете 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

Увидеть его в действии


  1. Запустите сохраненный скрипт.
    Запустите сохраненный скрипт.

  2. Вы увидите мигание окна консоли, после того как они закроются, единственное указание на то, что оно работает, будет парой новых процессов.

  3. Сделайте что-нибудь на своем рабочем столе для тестирования.

  4. Завершите созданный процесс PowerShell, когда вы больше не хотите его запускать.

Некоторая справочная информация - на случай, если вы не знакомы с инструментами, использованными в этом ответе.


  • Для получения дополнительной информации о System.IO.FileSystemWatcher пожалуйста, посетите его страницу MSDN.
  • Еще несколько примеров событий в PowerShell можно найти в этом блоге, который я нашел полезным.
  • Для начинающих на Windows PowerShell я нашел этот сайт полезным (мне нравятся их советы дня).
  • Если вы используете более старую версию Windows или по какой-то причине у вас не установлен PowerShell, вы можете загрузить Windows Management Framework 4.0.
7

Robocopy

/mot:<M>
Monitors source, and runs again in M minutes if changes are detected.

Поскольку он принимает только минуты в качестве аргумента, я думаю, вы не можете заставить его работать чаще. Однако вы можете запустить его, используя пакетный файл, и позволить синхронизации и цикличному выполнению происходить в пакетном файле или в запланированных задачах, а не в рамках Robocopy.

5

DSynchronize - это отдельная утилита, которая позволяет периодически синхронизировать две или более папок на жестком диске, дискете, в локальной сети, на USB-ключе, CD-DVD (с программным обеспечением для записи пакетов) и на FTP-сервере. Дело не совсем в том, о чем идет речь, а в том, что я смог найти ближе всего.

Я тоже искал решение для минимального времени в 1 минуту в Robocopy и нашел этот двухлетний вопрос. Я закончил тем, что мне предложили это программное обеспечение, и это то, что я использую. Для записи, я не имею никакого отношения к программному обеспечению.

Плюсы:

  • Имеет синхронизацию в реальном времени.
  • Можно добавить несколько пар папок и выбрать, какие пары активны в данный момент, используя флажки рядом с ними.
  • Нет установщика, отдельная программа.
  • Вы можете исключить или включить файлы с помощью шаблонов или измененного времени, нажав кнопку «Фильтр».
  • (другие; см. скриншот ниже. Флажки и кнопки имеют дополнительные подсказки.)

Минусы:

  • Утилита с графическим интерфейсом, переключатели командной строки недоступны
  • Все пары папок имеют одинаковые настройки

Скриншот

Параметр синхронизации в реальном времени отмечен на скриншоте в разделе «Специальные параметры». Это было бы тем, что вопрос, кажется, описывает как цель. Если он не отмечен, и у вас не установлен таймер, вы можете нажать кнопку «Синхронизировать», чтобы начать однократную синхронизацию.

Как синхронизировать две папки:

  • Выберите исходную папку, которую вы хотите отслеживать, используя диалог просмотра в верхнем левом углу.
  • Выберите папку назначения, в которую вы хотите скопировать изменения, в правом верхнем углу.
  • (Необязательно) Если вы вручную указали путь к папке, а не с помощью диалогового окна обзора, нажмите кнопку «ТЕСТ» между двумя полями вверху, чтобы увидеть, существуют ли эти папки на самом деле. Вы также захотите проверить «Создать папку, если она не существует» в большинстве случаев, чтобы удостовериться, что новые папки копируются, поскольку по умолчанию она не отмечена, и поэтому программа только копирует файлы по умолчанию.
  • Установите флажок «Синхронизация в реальном времени». Синхронизация теперь активна, и все изменения из левой папки будут скопированы в правую папку.

Я также нашел это видео на YouTube, которое показывает программное обеспечение в действии. Он показывает более старую версию и варианты не в том же месте, но он дает представление о том, как работает программное обеспечение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .