Копирование файлов по расширению

Обновлено: 06.07.2024

В разделе Примеры показан принцип использования этой команды.

Синтаксис

Параметры

Комментарии

Использование /z

Если вы потеряли подключение на этапе копирования (например, если сервер переходит в режим «вне сети»), то после повторного подключения Подключение возобновится. /z также отображает процент выполнения операции копирования для каждого файла.

Использование /y в переменной среды копикмд.

В переменной среды КОПИКМД можно использовать параметр /y . Эту команду можно переопределить с помощью /-и в командной строке. По умолчанию выводится запрос на перезапись.

Копирование зашифрованных файлов

Копирование зашифрованных файлов на том, который не поддерживает EFS, приводит к ошибке. Сначала расшифровать файлы или скопировать их на том, который поддерживает EFS.

Чтобы добавить файлы, укажите один файл для назначения, но несколько файлов для источника (то есть с помощью подстановочных знаков или формата file1 + file2 + файл3).

Значение по умолчанию для назначения

Если опустить назначение, команда xcopy скопирует файлы в текущий каталог.

Указание того, является ли назначение файлом или каталогом

Нажмите клавишу F, если хотите скопировать файл или файлы в файл. Нажмите клавишу D, если хотите скопировать файл или файлы в каталог.

Использование команды xcopy для установки атрибута архива для целевых файлов

Команда xcopy создает файлы с установленным атрибутом Archive, независимо от того, был ли этот атрибут задан в исходном файле. Дополнительные сведения об атрибутах файлов и attribсм. в разделе Дополнительные ссылки.

Сравнение xcopy и diskcopy

Если у вас есть диск, содержащий файлы в подкаталогах, и вы хотите скопировать его на диск, имеющий другой формат, используйте команду xcopy вместо команды diskcopy. Так как команда diskcopy копирует диски по дорожке, исходный и целевой диски должны иметь одинаковый формат. Команда xcopy не имеет этого требования. Используйте xcopy , если вам не нужна полная копия образа диска.

Коды выхода для команды xcopy

Для обработки кодов завершения, возвращаемых xcopy, используйте параметр ERRORLEVEL в командной строке If в пакетной программе. Пример пакетной программы, обрабатывающей коды завершения с помощью If, см. в разделе Дополнительные ссылки. В следующей таблице перечислены все коды выхода и их описание.

Примеры

1. чтобы скопировать все файлы и подкаталоги (включая все пустые подкаталоги) с диска A на диск B, введите:

2. чтобы включить в предыдущий пример все системные или скрытые файлы, добавьте параметр командной строки/h следующим образом:

3. чтобы обновить файлы в каталоге \репортс с файлами в каталоге \равдата, которые были изменены с 29 декабря 1993 г., введите:

4. чтобы обновить все файлы, существующие в \репортс в предыдущем примере, независимо от даты, введите:

5. чтобы получить список файлов для копирования с помощью предыдущей команды (т. е. без фактического копирования файлов), введите:

Файл xcopy. out содержит список всех копируемых файлов.

6. чтобы скопировать каталог \кустомер и все подкаталоги в каталог \\публик\аддресс на сетевом диске H:, оставьте атрибут "только для чтения" и при создании нового файла в H: введите:

8. можно создать пакетную программу для выполнения операций xcopy и использовать пакет If для обработки кода выхода при возникновении ошибки. Например, в следующей пакетной программе для параметров источника и назначения xcopy используются заменяемые параметры:

Чтобы использовать предыдущую пакетную программу для копирования всех файлов в каталоге К:\пргмкоде и его подкаталогов на диск B, введите:

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

В предыдущем примере это конкретное значение исходного параметра .\ток *. yml копирует те же три файла, даже если их два символа пути . \ были удалены. Однако файлы не копируются, если из исходного параметра был удален подстановочный знак «звездочка», что делает его просто .\ток.ИМЛ.

Решено: Копирование файлов с определенным расширением.

Модератор: SLEDopit

Решено: Копирование файлов с определенным расширением.

Здравствуйте.
Хоть вы подскажите какой командой можно скопировать все файлы с определенным расширением.
То есть есть директория в которой куча хлама, и куча директорий в которых опять же директории и хлам.

Мне нужно сделать скрипт который будет копировать с этой директории все файлы имеющие расширение mp3 mp4 avi
Пример

В этом случаи копируется содержимое dir1 со всеми папками и файлами. Но нужно тока с папками и файлами определенного расширения.

В итоге нужно получить

без лишних rgr.txt ooo.sh

Это как раз то что мне нужно с малыми недостатками, но то что нужно )))
Оно создало сетку директорий даже если в них нету нужных форматов.
Но это уже шаг. Во истину благодарен . Опция -m, она же --prune-empty-dirs
Вообще, почитайте man rsync.
тока и при присутствии ключа m тоже копируются все директории даже если в них нету нужных расширений.
man по rsync там как правила ключи и примеры работы для создание бекапов, и что то я не смог разобраться как записать ключи для выполнение этой задачи. Мне нужно сделать скрипт который будет копировать с этой директории все файлы имеющие расширение mp3 mp4 avi find \( -name "*.mp3" -o -name "*.mp4" -o -name "*.avi" \) -exec cp --parents -v -t target_dir/ <> +
мда. Настоящий линуксоид не ищет трудностей, он сам их придумывает. Ненужность rsync для локальных файлов уже обсуждалась.

Скоро придёт
Осень


Но с rsync было понятнее. А где здесь указывать откуда и куда ? find \( -name "*.mp3" -o -name "*.mp4" -o -name "*.avi" \) -exec cp --parents -v -t target_dir/ <> + Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.

Скоро придёт
Осень

для ускорения команды желательно, что-бы одна cp копировала сразу группу файлов. для этого есть специальный синтаксис:

--parents нужно для того, что-бы при копировании ./dir1/dir2/file1 автоматически создавались target_dir/dir1 и target_dir/dir1/dir2.

ну и наконец, + в find пихает все найденные файлы в хвост команды (файл1 файл2 файл3 файл4. ). (точнее обычно все, если они влезают)

FILTER RULES
The filter rules allow for flexible selection of which files to transfer (include) and which files to skip
(exclude). The rules either directly specify include/exclude patterns or they specify a way to acquire
more include/exclude patterns (e.g. to read them from a file).

As the list of files/directories to transfer is built, rsync checks each name to be transferred against
the list of include/exclude patterns in turn, and the first matching pattern is acted on: if it is an
exclude pattern, then that file is skipped; if it is an include pattern then that filename is not skipped;
if no matching pattern is found, then the filename is not skipped.

Rsync builds an ordered list of filter rules as specified on the command-line. Filter rules have the fol‐
lowing syntax:

RULE [PATTERN_OR_FILENAME]
RULE,MODIFIERS [PATTERN_OR_FILENAME]

You have your choice of using either short or long RULE names, as described below. If you use a
short-named rule, the ’,’ separating the RULE from the MODIFIERS is optional. The PATTERN or FILENAME
that follows (when present) must come after either a single space or an underscore (_). Here are the
available rule prefixes:

exclude, - specifies an exclude pattern.
include, + specifies an include pattern.
merge, . specifies a merge-file to read for more rules.
dir-merge, : specifies a per-directory merge-file.
hide, H specifies a pattern for hiding files from the transfer.
show, S files that match the pattern are not hidden.
protect, P specifies a pattern for protecting files from deletion.
risk, R files that match the pattern are not protected.
clear, ! clears the current include/exclude list (takes no arg)

Note that the --include/--exclude command-line options do not allow the full range of rule parsing as
described above -- they only allow the specification of include/exclude patterns plus a "!" token to clear
the list (and the normal comment parsing when rules are read from a file). If a pattern does not begin
with "- " (dash, space) or "+ " (plus, space), then the rule will be interpreted as if "+ " (for an
include option) or "- " (for an exclude option) were prefixed to the string. A --filter option, on the
other hand, must always contain either a short or long rule name at the start of the rule.

Note also that the --filter, --include, and --exclude options take one rule/pattern each. To add multiple
ones, you can repeat the options on the command-line, use the merge-file syntax of the --filter option, or
the --include-from/--exclude-from options.

INCLUDE/EXCLUDE PATTERN RULES
You can include and exclude files by specifying patterns using the "+", "-", etc. filter rules (as intro‐
duced in the FILTER RULES section above). The include/exclude rules each specify a pattern that is
matched against the names of the files that are going to be transferred. These patterns can take several
forms:

o if the pattern starts with a / then it is anchored to a particular spot in the hierarchy of files,
otherwise it is matched against the end of the pathname. This is similar to a leading ^ in regular
expressions. Thus "/foo" would match a name of "foo" at either the "root of the transfer" (for a
global rule) or in the merge-file’s directory (for a per-directory rule). An unqualified "foo"
would match a name of "foo" anywhere in the tree because the algorithm is applied recursively from
the top down; it behaves as if each path component gets a turn at being the end of the filename.
Even the unanchored "sub/foo" would match at any point in the hierarchy where a "foo" was found
within a directory named "sub". See the section on ANCHORING INCLUDE/EXCLUDE PATTERNS for a full
discussion of how to specify a pattern that matches at the root of the transfer.

o if the pattern ends with a / then it will only match a directory, not a regular file, symlink, or
device.

o rsync chooses between doing a simple string match and wildcard matching by checking if the pattern
contains one of these three wildcard characters: ’*’, ’?’, and ’[’ .

o a ’*’ matches any path component, but it stops at slashes.

o use ’**’ to match anything, including slashes.

o a ’?’ matches any character except a slash (/).

o a ’[’ introduces a character class, such as [a-z] or [[:alpha:]].

o in a wildcard pattern, a backslash can be used to escape a wildcard character, but it is matched
literally when no wildcards are present.

o if the pattern contains a / (not counting a trailing /) or a "**", then it is matched against the
full pathname, including any leading directories. If the pattern doesn’t contain a / or a "**",
then it is matched only against the final component of the filename. (Remember that the algorithm
is applied recursively so "full filename" can actually be any portion of a path from the starting
directory on down.)

o a trailing "dir_name/***" will match both the directory (as if "dir_name/" had been specified) and
everything in the directory (as if "dir_name/**" had been specified). This behavior was added in
version 2.6.7.

Note that, when using the --recursive (-r) option (which is implied by -a), every subcomponent of every
path is visited from the top down, so include/exclude patterns get applied recursively to each subcompo‐
nent’s full name (e.g. to include "/foo/bar/baz" the subcomponents "/foo" and "/foo/bar" must not be
excluded). The exclude patterns actually short-circuit the directory traversal stage when rsync finds the
files to send. If a pattern excludes a particular parent directory, it can render a deeper include pat‐
tern ineffectual because rsync did not descend through that excluded section of the hierarchy. This is
particularly important when using a trailing ’*’ rule. For instance, this won’t work:

This fails because the parent directory "some" is excluded by the ’*’ rule, so rsync never visits any of
the files in the "some" or "some/path" directories. One solution is to ask for all directories in the
hierarchy to be included by using a single rule: "+ */" (put it somewhere before the "- *" rule), and per‐
haps use the --prune-empty-dirs option. Another solution is to add specific include rules for all the
parent dirs that need to be visited. For instance, this set of rules works fine:

+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *

Here are some examples of exclude/include matching:

o "- *.o" would exclude all names matching *.o

o "- /foo" would exclude a file (or directory) named foo in the transfer-root directory

o "- foo/" would exclude any directory named foo

o "- /foo/*/bar" would exclude any file named bar which is at two levels below a directory named foo
in the transfer-root directory

o "- /foo/**/bar" would exclude any file named bar two or more levels below a directory named foo in
the transfer-root directory

o The combination of "+ */", "+ *.c", and "- *" would include all directories and C source files but
nothing else (see also the --prune-empty-dirs option)

o The combination of "+ foo/", "+ foo/bar.c", and "- *" would include only the foo directory and
foo/bar.c (the foo directory must be explicitly included or it would be excluded by the "*")

The following modifiers are accepted after a "+" or "-":

o A / specifies that the include/exclude rule should be matched against the absolute pathname of the
current item. For example, "-/ /etc/passwd" would exclude the passwd file any time the transfer
was sending files from the "/etc" directory, and "-/ subdir/foo" would always exclude "foo" when it
is in a dir named "subdir", even if "foo" is at the root of the current transfer.

o A ! specifies that the include/exclude should take effect if the pattern fails to match. For
instance, "-! */" would exclude all non-directories.
o A C is used to indicate that all the global CVS-exclude rules should be inserted as excludes in
place of the "-C". No arg should follow.

o An s is used to indicate that the rule applies to the sending side. When a rule affects the send‐
ing side, it prevents files from being transferred. The default is for a rule to affect both sides
unless --delete-excluded was specified, in which case default rules become sender-side only. See
also the hide (H) and show (S) rules, which are an alternate way to specify sending-side
includes/excludes.

o An r is used to indicate that the rule applies to the receiving side. When a rule affects the
receiving side, it prevents files from being deleted. See the s modifier for more info. See also
the protect (P) and risk ® rules, which are an alternate way to specify receiver-side
includes/excludes.

o A p indicates that a rule is perishable, meaning that it is ignored in directories that are being
deleted. For instance, the -C option’s default rules that exclude things like "CVS" and "*.o" are
marked as perishable, and will not prevent a directory that was removed on the source from being
deleted on the destination.

MERGE-FILE FILTER RULES
You can merge whole files into your filter rules by specifying either a merge (.) or a dir-merge (:) fil‐
ter rule (as introduced in the FILTER RULES section above).

There are two kinds of merged files -- single-instance (’.’) and per-directory (’:’). A single-instance
merge file is read one time, and its rules are incorporated into the filter list in the place of the "."
rule. For per-directory merge files, rsync will scan every directory that it traverses for the named
file, merging its contents when the file exists into the current list of inherited rules. These
per-directory rule files must be created on the sending side because it is the sending side that is being
scanned for the available files to transfer. These rule files may also need to be transferred to the
receiving side if you want them to affect what files don’t get deleted (see PER-DIRECTORY RULES AND DELETE
below).

The following modifiers are accepted after a merge or dir-merge rule:

o A - specifies that the file should consist of only exclude patterns, with no other rule-parsing
except for in-file comments.

o A + specifies that the file should consist of only include patterns, with no other rule-parsing
except for in-file comments.

o A C is a way to specify that the file should be read in a CVS-compatible manner. This turns on
’n’, ’w’, and ’-’, but also allows the list-clearing token (!) to be specified. If no filename is
provided, ".cvsignore" is assumed.

o An n specifies that the rules are not inherited by subdirectories.

o A w specifies that the rules are word-split on whitespace instead of the normal line-splitting.
This also turns off comments. Note: the space that separates the prefix from the rule is treated
specially, so "- foo + bar" is parsed as two rules (assuming that prefix-parsing wasn’t also dis‐
abled).

o You may also specify any of the modifiers for the "+" or "-" rules (above) in order to have the
rules that are read in from the file default to having that modifier set (except for the ! modi‐
fier, which would not be useful). For instance, "merge,-/ .excl" would treat the contents of .excl
as absolute-path excludes, while "dir-merge,s .filt" and ":sC" would each make all their per-direc‐
tory rules apply only on the sending side. If the merge rule specifies sides to affect (via the s
or r modifier or both), then the rules in the file must not specify sides (via a modifier or a rule
prefix such as hide).

Per-directory rules are inherited in all subdirectories of the directory where the merge-file was found
unless the ’n’ modifier was used. Each subdirectory’s rules are prefixed to the inherited per-directory
rules from its parents, which gives the newest rules a higher priority than the inherited rules. The
entire set of dir-merge rules are grouped together in the spot where the merge-file was specified, so it
is possible to override dir-merge rules via a rule that got specified earlier in the list of global rules.
When the list-clearing rule ("!") is read from a per-directory file, it only clears the inherited rules
for the current merge file.

Another way to prevent a single rule from a dir-merge file from being inherited is to anchor it with a
leading slash. Anchored rules in a per-directory merge-file are relative to the merge-file’s directory,
so a pattern "/foo" would only match the file "foo" in the directory where the dir-merge filter file was
found.

Here’s an example filter file which you’d specify via --filter=". file":

If a per-directory merge-file is specified with a path that is a parent directory of the first transfer
directory, rsync will scan all the parent dirs from that starting point to the transfer directory for the
indicated per-directory file. For instance, here is a common filter (see -F):

That rule tells rsync to scan for the file .rsync-filter in all directories from the root down through the
parent directory of the transfer prior to the start of the normal directory scan of the file in the direc‐
tories that are sent as a part of the transfer. (Note: for an rsync daemon, the root is always the same
as the module’s "path".)

Some examples of this pre-scanning for per-directory files:

rsync -avF /src/path/ /dest/dir
rsync -av --filter=': ../../.rsync-filter' /src/path/ /dest/dir
rsync -av --filter=': .rsync-filter' /src/path/ /dest/dir

The first two commands above will look for ".rsync-filter" in "/" and "/src" before the normal scan begins
looking for the file in "/src/path" and its subdirectories. The last command avoids the parent-dir scan
and only looks for the ".rsync-filter" files in each directory that is a part of the transfer.

If you want to include the contents of a ".cvsignore" in your patterns, you should use the rule ":C",
which creates a dir-merge of the .cvsignore file, but parsed in a CVS-compatible manner. You can use this
to affect where the --cvs-exclude (-C) option’s inclusion of the per-directory .cvsignore file gets placed
into your rules by putting the ":C" wherever you like in your filter rules. Without this, rsync would add
the dir-merge rule for the .cvsignore file at the end of all your other rules (giving it a lower priority
than your command-line rules). For example:

cat <<EOT | rsync -avC --filter='. -' a/ b
+ foo.o
:C
- *.old
EOT
rsync -avC --include=foo.o -f :C --exclude='*.old' a/ b

date

25.11.2020

directory

Windows 10, Утилиты

comments

комментариев 8

Robocopy – это консольная утилита Windows для копирования файлов, которую можно использовать для синхронизации/репликации файлов и каталогов, и в сценариях резервного копирования. Robocopy (Robust File Copy) доступна начиная с Windows NT 4.0 Resource Kit, но по умолчанию эта функция появилась только в Windows Vista и Windows Server 2008. Robocopy заменяет Xcopy и copy, как более функциональная.

Основные возможности Robocopy

Кроме обычного копирования файлов и папок из папки источника в каталог назначения, в Robocopy есть множество очень полезных функций:

  • Устойчивость к обрывам сети (robocopy может продолжить копирования после восстановления сетевого доступа);
  • Корректное копирование файлов с их атрибутами и NTFS правами доступа;
  • Копирование с сохранением исходной временной метки;
  • Возможность копирования файлов и директорий, запрещенных для доступа даже администратору, с помощью ключа /B (ключ позволяет игнорировать проверку прав доступа, ключ доступен только для участников группы Администраторы или Операторы архива);
  • Возможность задать количество попыток копирования файла, если файл недоступен;
  • Режим полного зеркалирования директорий;
  • Пропуск уже существующих файлов (с одинаковым размером или временной меткой timestamp);
  • Индикатор прогресса копирования;
  • Корректная работа с длинными путями (более 260 символов);
  • Эффективные алгоритмы и многопоточность позволяют выполнять копирование файлов намного быстрее, чем обычное копирование средствами Windows;

Официальной графической версии robocopy (c GUI) от Microsoft нет. Существуют пользовательские версии, но их поддержка прекращена. Список неофициальных GUI для robocopy (это сторонние программы):

Синтаксис и параметры robocopy

Синтаксис robocopy состоит из двух обязательных параметров (исходный и целевой каталог) и двух необязательных (фильтр файлов и параметры):

robocopy <source> <dest> [фильтр файлов] [параметры]

Поддерживаются как локальные пути, так и UNC, например, \\server\directory

Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде:

использование утилиты robocopy в windows для копирование и синхронизации файлов и каталогов

Исполняемы файл robocopy.exe находится в каталоге C:\Windows\System32.

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

Для тестирование различных команд robocopy без выполнения операций (копирования, перемещения или удаления) с файлами используется параметр /L . Данный параметр вернет список файлов и папок, которые будут скопированы вашей командой.

Использование robocopy для зеркалирования каталогов

Вы можете зеркалировать (синхронизировать) содержимое двух каталог с помощью следующей команды robocopy (под зеркалированием понимается копирование файлов из целевой папки с удалением файлов в целевом каталоге, если они удалены в источнике).

robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ *.txt /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log

Обратите внимание на ключ /Z даже если вы копируете небольшие файлы по устойчивому каналу. Он не несёт дополнительных расходов при использовании, но в случае обрыва, вы сможете продолжить копирование просто повторно запустив скрипт.

При копировании больших файлов (более 2 Гб) с некоторых iSCSI/SAN томов, процесс robocopy может существенно использовать оперативную память сервера. Проблем обычно связано с тем, что для данного LUN в настройках RAID используется write-through кэширование вместо write-back.

Инкрементальное копирование с помощью robocopy

Сам по себе robocopy не может полностью обеспечить инкрементальное резервное копирование каталога (копирование новых и измененных файлов), для этого мы будем использовать небольшой bat скрипт:

Заметка. Если файловые системы source или dest не являются NTFS, используйте ключ /FFT , так как на других файловых системах (включая эмулированные NTFS) может возникнуть ошибка, из-за которой robocopy будет видеть старые файлы как измененные, из-за отличий в метке времени.

Robocopy: перемещение файлов

С помощью ключа /mov или /move вы можете переместить файлы (а точнее удалить успешно скопированные файлы из исходной директории):

robocopy C:\source\ F:\dest\ /MOVE /E /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log

  • /MOVE – удалить файлы и директории из исходной папки, после того как они были скопированы. Имейте в виду, что этот ключ нужно использовать вместе с /E или /S, в противном случае вы перенесете только файлы, но не директории. Если вы хотите перенести только файлы, используйте ключ /MOV
Примечание. Поведение robocopy при использовании ключей /MOVE и /MOV не интуитивно.
  • Если вы используете ключ /MOVE с ключом /E, то вы перенесете все файлы, директории (включая файлы внутри них) и пустые директории. Файлы и директории удалятся из исходной папки. /MOVE с /S даст такой же результат, но пустые директории не перенесутся и будут удалены.
  • Если вы используете ключ /MOV с ключом /E, то вы перенесете все файлы, включая те, которые находятся в директориях и поддиректориях, также скопируются все директории (включая пустые), но они не будут удалены из исходного каталога, в отличие от файлов. Используя /MOV с /S, вы получите такой же результат, но пустые директории не будут скопированы.

Пример использование robocopy в планировщике задач

Для примера возьмём задачу: нам необходимо с помощью robocopy регулярно синхронизировать содержимое сетевой папки между двумя серверами с ведением логов.

Запустите командную строку с правами администратора и введите: compmgmt.msc

Перейдите в System Tools -> Task Scheduler Library. Создайте новое задание планировщика (Create task).

создать задание планировшика robocopy

Укажите имя задания, и выберите пользователя из-под которого будет выполняться задание. Пользователь должен иметь доступ на чтению и запись в обоих каталогах (при копировании по сети между серверами домена можно использовать аккаунт System, в этом случае нужно предоставить на целевой каталог права RW для объекта computer сервера-источника) .

Выберите опцию Run whether user is logged on or not, для того чтобы задание выполнялось в фоновом режиме. Также отметьте Run with highest privileges. Эта опция сработает если аккаунт из-под которого выполняется задание, будет иметь права администратора.

задание зеркалирования robocopy

Перейдите на вкладку Triggers и создайте новый триггер.

Выберите параметр On a schedule (по расписанию), выберите время начала и отметьте Repeat task every, указав интервал выполнения. В моём случае это 5 минут – каждые 5 минут, начиная с часа дня 22 апреля (обязательно измените эту дату на ту, которая нужна вам), директории будут синхронизированы. В for a duration of поставьте Indefinitely (бесконечно)

расписание запуска

Перейдите во вкладку Actions и нажмите New…

Выберите Start a program, и укажите путь к .bat скрипту.

Содержание robocopy-mirror.bat:

Помимо журнала выполнения задания планировщика, robocopy будет писать собственный лог файл копирования в C:\robocopy.log. Если аккаунт из-под которого будет выполняться скрипт не имеет прав администратора, смените C:\robocopy.log на нужный вам путь.

запуск команды robocopy через планировшик

Остальные настройки заполнять не надо. После нажатия на кнопку ОК, вас попросит ввести пароль от учетной записи, которую вы выбрали для запуска задания.

события запуска задания планировщика

Если вы всё настроили правильно, директории должны начать синхронизироваться.

Если у вас возникли проблемы с выполнением скрипта, то обязательно проверьте вкладку History вашей задачи

журнал запуска планировщика robocopy

Отслеживание изменений в каталогах с помощью robocopy

В robocopy есть встроенный механизм отслеживания изменений в исходном каталоге (и их последующего копирования) и встроенный планировщик – параметры /mon и /mot .

  • /mon:N – проверяет исходную директорию на предмет изменений каждую 1 минуту, и если изменений в директории больше чем N, то будет произведено копирование в целевую директорию. Если задан параметр /mot:Y, то изменения будут проверяться каждые Y минут.
  • /mot:N – проверяет исходную директорию на предмет изменений каждые N минут. Минимальное значение N = 1, в минутах. Если параметр /mon не задан, то будет считаться что /mon:1

.bat скрипт для зеркалирования с отслеживанием изменений с интервалом в 1 минуту. Этот скрипт нужно запускать из-под аккаунта с правами администратора.

Плюсы:

  • Не нужно создавать задание в планировщике задач
  • Подходит для непостоянного выполнения. Например, в течение нескольких часов, в таком случае запустить скрипт руками через CMD проще, чем создавать задание в планировщике

Минусы:

  • Чтобы запустить .bat скрипт в фоновом режиме, нужно либо использовать VBS скрипт, либо стороннее ПО, например, NirCmd.
  • Минимальный интервал поиска изменений и копирования – 1 минута. Для меньшего интервала нужно использовать PowerShell или bat скрипт.

Коды возврата (ошибки) robocopy

Ниже приведены стандартные коды возврата robocopy, которые можно использовать для обработки различных ошибок, которые возвращает утилита после выполнения действия копирования (кот возврата эта битовая маска).

HexDecimalMeaning if set
0x000No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized.
0x011One or more files were copied successfully (that is, new files have arrived).
0x022Some Extra files or directories were detected. No files were copied Examine the output log for details.
0x044Some Mismatched files or directories were detected. Examine the output log. Housekeeping might be required.
0x088Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further.
0x1016Serious error. Robocopy did not copy any files. Either a usage error or an error due to insufficient access privileges on the source or destination directories.
Коды возврата могут комбинироваться:
0x033(2+1) Some files were copied. Additional files were present. No failure was encountered.
0x055(4+1) Some files were copied. Some files were mismatched. No failure was encountered.
0x066(4+2) Additional files and mismatched files exist. No files were copied and no failures were encountered. This means that the files already exist in the destination directory
0x077(4+1+2) Files were copied, a file mismatch was present, and additional files were present.

Любое значение больше 7 говорит о том, что при копировании через robocopy возникла ошибка. Вы можете обрабатывать эти ошибки в bat файле:

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end
:end

Утилита robocopy имеет огромный функционал и позволяет гибко настроить операции копирования. Как альтернативу robocopy в PowerShell можно использовать командлет Copy-Item, который хоть и менее функционален, но работает с объектной моделью PowerShell, что может быть важно, если вы часто используете PowerShell или используете цепочки автоматизации с другими языками программирования.

Команда COPY при работе в командной строке позволяет копировать один или несколько файлов. Команда имеет синтаксис: COPY[/D][/V][/N][/Y | /-Y][/Z][/L][/A | /B]источник[/A | /B][+ источник[/A | /B] [+ . ]][результат [/A | /B]]. Источником является имя копируемого файла, а результатом является каталог, в который будет помещена копия этого файла и/или имя создаваемого файла.

Для примера, создадим на диске «С» какой-нибудь файл (я создал текстовый файл «robot.txt»), а на диске «D» какую-нибудь папку (я создал папку «folder1»). Тогда команда для копирования файла «robot.txt» в папку «folder1» выглядит так: copy robot.txt d:\folder1

copy

Если необходимо скопировать файл, изменив при этом его имя, необходимо записать следующую команду: copy robot.txt d:\folder1\file.txt В этом случае, файл «robot.txt» будет скопирован в папку «folder1», но уже с именем «file.txt».

copy.

Для того чтобы скопировать все файлы с выбранным расширением, необходимо вместо названия файла поставить звездочку «*». Например, создадим на диске «С» какую-нибудь папку (я создал папку «papka») и скопируем в нее все текстовые файлы из папки «folder1», расположенной на диске «D». Команда будет иметь вид: copy d:\folder1\*.txt c:\papka

copy..

Если в качестве [результата] не указывать каталог, то команда copy скопирует файл (или файлы) и поместит их в текущем каталоге. При этом скопированные файлы будут иметь то же имя, дату и время создания, что и исходный файл. Например, создадим в папке «folder1», расположенной на диске «D» текстовый файл с именем «robot1.txt». После этого в командной строке изменим текущий каталог с «C:\>» на «C:\Papka». Тогда команда copy d:\folder1\robot1.txt скопирует файл «robot1.txt» из папки «folder1» и поместит его в текущем каталоге, т.е. в папку «papka», расположенную на диске «C». Причем, имя, дата и время создания скопированного файла будет идентично исходному файлу.

copy.

Для того чтобы скопировать все файлы из определенного каталога, необходимо вместо названия файла поставить звездочку «*» и вместо расширения файла поставить звездочку «*». Например, создадим в папке «folder1» несколько файлов, имеющих различные расширения (документ Word, архив Rar и т.д.). Тогда команда для копирования всех файлов из папки «folder1» на диск «C» будет выглядеть: copy d:\folder1\*.* c:\

copy.

  • LPT1 – LPT3 (параллельные порты).
  • COM1 – COM3 (последовательные порты).
  • CON (терминал, при выводе это экран компьютера, при вводе – клавиатура).
  • PRN (принтер).
  • AUX (устройство, подсоединяемое к последовательному порту 1).

Например, с помощью командной строки и команды «copy» можно создать текстовый файл и записать в него информацию: copy con f1.txt . Команда copy con f1.txt создаст текстовый файл «f1.txt» и скопирует в него символы, которые вы будете вводить с клавиатуры.

copy.

После ввода команды copy con f1.txt нажимаем Enter и вводим слова, которые необходимо сохранить (я ввел command com). После ввода необходимо поставить признак конца файла (нажать Ctrl+Z).
C помощью команды copy можно объединять несколько файлов в один файл. Например, создадим на диске «C» два файла f2.txt и f3.txt (файл f1.txt мы создали ранее) и запишем в эти файлы какую-нибудь информацию. Тогда команда copy f1.txt+f2.txt+f3.txt d:\f4.txt скопирует содержимое файлов «f1.txt», «f2.txt», «f3.txt» в файл «f4.txt», который будет автоматически создан на диске «D».

copy.

Если при объединении файлов не указывать файл - [результат], то вся информация будет сохранена в первом файле. Например, команда copy f1.txt+f2.txt+f3.txt добавит к содержимому файла f1.txt содержимое файлов f2.txt и f3.txt

copy.

copy2

Читайте также: