Копирование файлов по сети
Всем привет! Сегодня мы разберем очередной вопрос, как перекинуть файлы с компьютера на компьютер. Я постарался рассмотреть все варианты: от использования локальной сети до передачи больших файлов через интернет. Также все описал достаточно подробно, но если у вас возникнут какие-то вопросы при прочтении – пишите в комментариях, помогу чем смогу.
Коды возврата (ошибки) robocopy
Ниже приведены стандартные коды возврата robocopy, которые можно использовать для обработки различных ошибок, которые возвращает утилита после выполнения действия копирования (кот возврата эта битовая маска).
Hex | Decimal | Meaning if set |
0x00 | 0 | No errors occurred, and no copying was done. The source and destination directory trees are completely synchronized. |
0x01 | 1 | One or more files were copied successfully (that is, new files have arrived). |
0x02 | 2 | Some Extra files or directories were detected. No files were copied Examine the output log for details. |
0x04 | 4 | Some Mismatched files or directories were detected. Examine the output log. Housekeeping might be required. |
0x08 | 8 | Some files or directories could not be copied (copy errors occurred and the retry limit was exceeded). Check these errors further. |
0x10 | 16 | Serious 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. |
Коды возврата могут комбинироваться: | ||
0x03 | 3 | (2+1) Some files were copied. Additional files were present. No failure was encountered. |
0x05 | 5 | (4+1) Some files were copied. Some files were mismatched. No failure was encountered. |
0x06 | 6 | (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 |
0x07 | 7 | (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 или используете цепочки автоматизации с другими языками программирования.
Способ 3: Использовать Облако
Если второй компьютер находится достаточно далеко, то можно использовать облачное хранилище. Минусом такого способа является то, что бесплатное хранение ограничено у популярных облачных серверов:
Если у вас уже есть почтовые ящики этих сервисов, то можете просто перейти по соответствующим ссылкам:
Если же у вас нет ни одного аккаунта, то вам нужно будет его создать. Так как самым просторным является «Мыло», то покажу на её примере.
- Чтобы закинуть файл, нужно просто его перетащить с компьютера в рабочую область. Или вы можете нажать по кнопке загрузки.
- Как только файл будет загружен вы можете поделиться ссылкой на него.
- Ссылку можно перекинуть в любую социальную сеть, или скопировать её и передать через мессенджер.
Если у вас еще остались вопросы, то советую почитать про то, что такое облако – тут.
Копирование с фильтрацией по шаблону
С помощью Copy-Item можно скопировать файлы/директории выбранные с помощью wildcard символа * или с помощью символа ?. Также поддерживаются некоторые регулярные выражения
- * — обозначает любое количество любых символов
- ? – обозначает 1 любой символ
- [a-z], 7 – символы между a-z и цифры между 0 и 9
Для примера возьмём такую структуру файлов:
Выполним копирование командой:
Copy-Item -Path "C:\SourceFolder\fol*" -Destination "F:\DestFolder\"
Результат в F:\DestFolder\
Теперь чистим папку назначения и выполняем:
Copy-Item -Path "C:\SourceFolder\folder1" -Destination "F:\DestFolder\"
Папка без цифры в окончании не скопировалась, потому что folder3 подразумевает что после folder будет как минимум еще 1 символ между 0 и 3
Копирование всего содержимого общей сетевой папки через BITS
Как мы уже говорили, для работы BITS не нужен Web сервер, это означает, что вы можем скопировать файлы непосредственно с других Windows-компьютеров или общих сетевых папок:
Start-BitsTransfer -Source \\msk-rep01\os\rhel-server-7.0-x86_64-dvd.iso -Destination c:\temp -Asynchronous
Командлеты модуля BitsTransfer не умеют рекурсивно копировать все файлы и папки из определённой директории, или файлы, которые используются другими программами. Чтобы из указанной сетевой папки скопировать все файлы с подкаталогами, воспользуемся такой функцией (можно предварительно проверить, существует ли целевой каталог и создать его):
Import-Module BitsTransfer
$Source="\\msk-rep01\os\"
$Destination="c:\tmp\"
if ( -Not (Test-Path $Destination))
$null = New-Item -Path $Destination -ItemType Directory
>
$folders = Get-ChildItem -Name -Path $source -Directory -Recurse
$job = Start-BitsTransfer -Source $Source\*.* -Destination $Destination -asynchronous -Priority low
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') )
Sleep 3
>
Complete-BitsTransfer -BitsJob $job
foreach ($i in $folders)
$exists = Test-Path $Destination\$i
if ($exists -eq $false)
$job = Start-BitsTransfer -Source $Source\$i\*.* -Destination $Destination\$i -asynchronous -Priority low
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') )
Sleep 3
>
Complete-BitsTransfer -BitsJob $job
>
Если вы используете анонимную авторизацию, необходимо разрешить анонимным пользователям запись в каталог на уровне NTFS. Если загрузка файлов выполняется под авторизованными пользователями, им необходимо предоставить RW разрешения на папку загрузки.
Обратите внимание, что по-умолчанию IIS позволяет загружать файлы до 30 Мб. Чтобы разрешить загружать большие файлы, нужно в файле web.config изменить значение в параметре maxAllowContentLength.
Таким образом, использование возможностей BITS представляет собой отличную альтернативу традиционному копированию файлов по сети по протоколу SMB. В отличии от последнего, задание копирования файлов BITS выполняется несмотря на разрывы связи и перезагрузки компьютеров, и не так загружает канал связи, не мешая работе других сетевых приложений и пользователей. Протокол BITS может быть оптимальным решением для передачи по WAN сети больших файлов ISO образов и файлов виртуальных машин (vmdk, vhdx).
25.11.2020
insci
Windows 10, Утилиты
комментариев 9
Robocopy – это консольная утилита Windows для копирования файлов, которую можно использовать для синхронизации/репликации файлов и каталогов, и в сценариях резервного копирования. Robocopy (Robust File Copy) доступна начиная с Windows NT 4.0 Resource Kit, но по умолчанию эта функция появилась только в Windows Vista и Windows Server 2008. Robocopy заменяет Xcopy и copy, как более функциональная.
Ключ PassThru
Командлет Copy-Item (как и многие другие командлеты PowerShell) не возвращает результатов в консоль. Параметр PassThru применяется скриптах, или для лог-файлов, когда нужно получить список скопированных файлов и работать с ним дальше. Рассмотрим пример
$items = Copy-Item -Path "C:\SourceFolder\*" –Destination "\\testnode1\C$\copy_tutorial\" -PassThru
Переменная $items будет содержать список скопированных файлов, с которым вы можете работать дальше.Это значит что вы можете напрямую работать с этими файлами. Например выполнив команду Remove-Item $items[0] , вы удалите директорию folder.
Протокол BITS
BITS или Background Intelligent Transfer service — (Фоновая интеллектуальная служба передачи) – это служба Windows, которая используется для передачи файлов между системами. С помощью протокола BITS можно передавать как скачивать, так и закачивать файлы. Именно по этому протоколу компьютеры скачивают файлы с серверов при выполнении автоматического обновлении Windows (в т.ч. при скачивании обновлений со WSUS сервера), при получении программ с SCCM точек распространения и т.д.
Преимущества протокола BITS:
- BITS — интеллектуальный протокол, который при работе способен регулировать используемую полосу канала связи, чтобы не оказывать влияния на другие сетевые приложения и сервисы. BITS может использовать только незанятую полосу пропускания канала и динамически изменять скорость передачи данных в процессе работы (если другие приложения увеличат нагрузку на сеть, BITS может уменьшить скорость передачи данных по сети);
- Загрузка файла может идти в фоновом режиме, незаметно для пользователя;
- Задание BITS в режиме докачки будет автоматически продолжено даже в случае обрыва канали связи между компьютером и клиентом, или после перезагрузки компьютера;
- В любой момент вы можете приостановить или возобновить загрузку по BITS без потери данных;
На заметку. Возможность перезапуска процедуры копирования файлов по сети имеется также и в утилите robocopy.exe, позволяющей возобновить закачку файла в случае обрыва соединения.
Таким образом, BITS является оптимальным протоколом для передачи больших файлов по медленным и нестабильным сетям (спутниковый канал, GPRS соединение и т.д.).
Синтаксис и параметры robocopy
Синтаксис robocopy состоит из двух обязательных параметров (исходный и целевой каталог) и двух необязательных (фильтр файлов и параметры):
robocopy [фильтр файлов] [параметры]
Поддерживаются как локальные пути, так и UNC, например, \\server\directory
Полный синтаксис утилиты robocopy (все параметры и их описания) доступны по команде:
Поскольку ключей в robocopy много, мы будем рассматривать их на практике, в готовых командах. Мы не будем рассматривать самые простые примеры использования robocopy, т.к. обычно они не вызывают вопросов. Ниже представлены готовые к применению более сложные команды robocopy, которые можно использовать в реальных сценариях.
Для тестирование различных команд robocopy без выполнения операций (копирования, перемещения или удаления) с файлами используется параметр /L . Данный параметр вернет список файлов и папок, которые будут скопированы вашей командой.
Видео
Всем привет! Сегодня в статье мы будем разбирать вопрос – как передать файлы по локальной сети. На самом деле ничего сложного нет, но надо правильно настроить политику безопасности на двух компьютерах или ноутбуках. В первую очередь нужно, чтобы два устройства, то бишь компьютера – были в одной локальной сетки. Для этого их можно подключить к одному маршрутизатору или роутеру.
Сделать это можно двумя способами:
- По кабелю – если на роутере достаточно LAN портов, то просто с помощью сетевого кабеля подключаем два аппарата;
- По Wi-Fi – просто подключаемся к беспроводной сети.
Далее нужно выполнить некоторые действия, который помогут связаться двум компьютерам. Если у вас что-то будет не получаться или будут какие-то проблемы – пишите в комментарии.
ПРИМЕЧАНИЕ! Если вам нужен обмен файлами в локальной сети между компьютером и телефоном, то для этого используем другую инструкцию – переходим по этой ссылке.
Способ 6: Через Bit-Torrent
Самая популярная и лучшая программа для передачи файлов. Таким образом вы можете перенести файлы любых размеров. Самое главное, чтобы оба ноутбука или ПК были подключены к интернету.
- Скачиваем торрент отсюда .
- Устанавливаем и запускаем программу.
- Просто перетащите любой файл или папку в рабочую область.
- После этого вы увидите ссылку на файл – кликаем «Копировать».
- Теперь на втором компьютере закидываем эту ссылку в адресную строку любого браузера.
- После скачивания файла, запускаем его в программе uTorrent и ждем пока данные скачаются. Во время скачивания оба компьютеры должны быть подключены к интернету.
Способ 4: С помощью жесткого диска
План такой: мы отключаем жесткий диск от компьютера, с которого мы хотим передать нужные файлы и подключаем его ко второму компьютеру. Ничего сложного в этом нет, только заранее, на всякий случай обесточьте системные блоки – то есть полностью их выключите и отключите от розетки.
Далее открываем боковую крышку – для этого нужно будет открутить задние болты, которые её держат. После этого находим жесткий диск. Он скорее всего тоже будет держаться на болтах, откручиваем их и вынимаем. Останется отключить два провода – один идет от блока питания, второй от материнской платы.
Теперь аналогичным образом подключаем жестак ко второму компу. Если вы будете подключать жесткий диск к ноутбуку, то понадобится специальный переходник. Аналогичные переходники есть и для жестких дисков с ноутбуков.
Сложнее всего таким образом скинуть информацию с ноутбука на ноутбук, так как оба придется разбирать. Некоторые производители ноутбуков достаточно глубоко прячут жесткие диски.
Отслеживание изменений в каталогах с помощью 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 скрипт.
Способ 1: По локальной сети (по кабелю или Wi-Fi)
У вас есть три варианта подключения, чтобы произвести передачу файлов с компьютера на компьютер в пределах локальной сети:
- Подключить два компьютера напрямую с помощью кабеля.
- Использовать домашний роутер – тогда к роутеру можно подключиться как по кабелю, так и по Wi-Fi.
- Использовать подключение двух компьютеров по Wi-Fi.
Как видите вариантов достаточно много. Далее, что мы будем делать. Сначала мы подключим устройства, выбрав один из удобных для вас варианта. После этого в Windows нужно будет настроить домашнюю группу. Обязательно нужно сконфигурировать параметры общего доступа к папкам и файлам ПК. Также нужно настроить IP адреса. И в самом конце сделать одну из папок общей, чтобы в неё можно было закинуть нужные файлы.
На самом деле ничего страшного нет, и все настраивается очень просто. Зато после этого вы сможете в сети иметь постоянную общую папку, куда вы сможете закидывать любые данные. Так как инструкция достаточно обширная, то я вынес её отдельно и с ней вы можете ознакомиться по этой ссылке.
Ключ Verbose
При использовании ключа -Verbose вы получите подробный лог операций копирования. Например, вывод команды
Copy-Item -Path "C:\SourceFolder\*.txt" -Destination "F:\DestFolder\" -Recurse -Force -Verbose
Способ 5: Отправка по почте
Инструкция
- На первом шаге, нам нужно проверить, чтобы два компьютера были в одной рабочей группе. Для этого найдите на клавиатуре две клавиши и R и нажмите на них.
- По умолчанию в Windows рабочая группа называется, как «WORKGROUP». Но на всякий случай проверьте, чтобы на обоих аппаратах была одинаковое название. Также его можно изменить, если будет какие-то отличия. Если названия будут разные, то они не будут видеть друг друга.
- Теперь нам надо зайти и посмотреть какая тип сетки, стоит на каждом компьютере. Нажимаем правой кнопкой по подключению в правом нижнем углу экрана и переходим в центр управления.
- Нам нужно выбрать «Домашнюю» или «Частную» сетка.
- Далее вы можете увидеть пароль или код, но лучше его отключить – так как это не очень удобно при использовании в домашней локалке.
- Как только закроете предыдущее окошко, нажмите «Изменить дополнительные параметры общего доступа».
- Как видите стоит текущий профиль как домашняя или рабочая (по сути это одно и тоже). В первых трех пунктах убедитесь, чтобы компьютер обнаруживался в сети, а также был включены общие папки и файлы.
- Пролистываем чуть ниже и отключаем парольную защиту и доступ к вашему компьютеру. В принципе вы можете и оставить этот пункт, но тогда нужно при подключении к данному ПК вводить пароль. Он вводится один раз.
- Теперь вы можете расшарить или по-другому – сделать общей папку, которую будет видно в сети и куда можно скидывать файлы для общего использования. Можно также выбрать уже существующую папку, например: «Документы», «Видео», «Фото» и т.д. После, этого чтобы сделать её общей, нажмите правой кнопкой и зайдите в «Свойства».
- Нажмите на поле или на стрелочку правее и выберите «Домашняя группа». После этого нажмите «Добавить».
- Ещё один момент – по умолчанию стоит право «Чтение», то есть пользователи вы сети не смогут изменять данную папку, загружать туда что-то. Так что я бы рекомендовал установить «Чтение и запись».
Теперь вы знаете – как передавать файлы по локальной сети и ничего сложного в этом нет. Всё же, если у вас возникли какие-то трудности, вылезла ошибка – то пишите в комментариях, и я вам обязательно помогу.
Сенсей по решению проблем с WiFiем. Обладатель оленьего свитера, колчана витой пары и харизматичной бороды. Любитель душевных посиделок за танками.
Друзья, приветствую вас на WiFiGid. Относительно недавно с требованием для отчетности ИП получить электронную
Вот у меня как раз был косяк, когда пытался подключиться к компу с ХР. Просто надо было убрать пароль – спасибо вам
Все получилось спасибо
Ну и замудренно конечно, но работает хоть
Организовал домашнюю сеть по инструкциям автора – все работает. Спасибо огромное, даже не думал, что так удобно можно было все в доме организовать. Дошел до следующей идеи фикс – “заходить” в папки смартфона с компьютера, почитал инструкции этого же автора и сделал это через работу ftp-сервера. Но результат немного не тот, который ожидал: все файлы на смарте отображаются в окне проводника компьютера, можно копировать и перемещать, но неудобно, что их нельзя предварительно просмотреть (фотки например); при двойном клике – запускается браузер, который выдает ошибку. По данному поводу читал статьи в сети, может быть неправильно понял, но FTP протокол не позволит сделать так, как мне хочется. Неужели нет какого-то способа кроме как связывать комп и смарт USB шнурком? Можете дать совет?
13.05.2020
insci
PowerShell
комментариев 6
PowerShell командлет Copy-Item используется для копирования файлов между локальными, сетевыми каталогами или между компьютерами по сети через WinRM. Командлет Copy-Item предоставляет большое количество опций, которые можно использовать в разных сценариях копирования файлов и каталогов (по своим возможностям этот командлет почти не уступает утилите robocopy). Например:
- перезапись файлов (override)
- фильтрация по имени/шаблону
- исключение по имени/шаблону
Начнем с простых примеров использования Copy-Item и будем переходить к более сложным.
Основные возможности Robocopy
Кроме обычного копирования файлов и папок из папки источника в каталог назначения, в Robocopy есть множество очень полезных функций:
- Устойчивость к обрывам сети (robocopy может продолжить копирования после восстановления сетевого доступа);
- Корректное копирование файлов с их атрибутами и NTFS правами доступа;
- Копирование с сохранением исходной временной метки;
- Возможность копирования файлов и директорий, запрещенных для доступа даже администратору, с помощью ключа /B (ключ позволяет игнорировать проверку прав доступа, ключ доступен только для участников группы Администраторы или Операторы архива);
- Возможность задать количество попыток копирования файла, если файл недоступен;
- Режим полного зеркалирования директорий;
- Пропуск уже существующих файлов (с одинаковым размером или временной меткой timestamp);
- Индикатор прогресса копирования;
- Корректная работа с длинными путями (более 260 символов);
- Эффективные алгоритмы и многопоточность позволяют выполнять копирование файлов намного быстрее, чем обычное копирование средствами Windows;
Официальной графической версии robocopy (c GUI) от Microsoft нет. Существуют пользовательские версии, но их поддержка прекращена. Список неофициальных GUI для robocopy (это сторонние программы):
Исключение файлов при копировании
С помощью ключа –Exclude можно исключить файлы при копировании. Например, следующай команда скопирует все файлы кроме файлов с расширением txt.
Copy-Item -Path "C:\SourceFolder\*" -Destination "F:\DestFolder\" -Recurse -Force -Exclude "*.txt"
Аналогичным же образом можно применить ключ –Include, например
Copy-Item -Path "C:\SourceFolder\*" -Destination "F:\DestFolder\" -Recurse -Force -Include "*.txt"
Скопирует только txt файлы. Хотя для простоты гораздо удобнее использовать при копировании вид -Path "C:\SourceFolder\*.txt" .
Способ 2: С помощью флэшки
Это самый простой и самый быстрый способ перенести файлы без интернета с ПК на ПК.
- Вставляем флешку или переносной жесткий диск в свободный USB порт компьютера, с которого вы хотите передать файлы.
- Открываем проводник или «Этот компьютер».
- У вас отобразится ваша флешка – раскрываем её содержимое двойным щелчком ЛКМ.
- Аналогичным образом открываем эти файлы на втором компе.
Инкрементальное копирование с помощью robocopy
Сам по себе robocopy не может полностью обеспечить инкрементальное резервное копирование каталога (копирование новых и измененных файлов), для этого мы будем использовать небольшой bat скрипт:
- set date_=%date:/=-% — эта строчка присваивает значение переменной date_ в формате DD.MM.YYYY
- /maxage:1 — Максимальный возраст файла. Исключает файлы старше N дней или даты. Дата указывается в формате YYMMDD, например, /maxage:20200421
- /E – копирует подпапки, без ограничения уровня вложенности. Для контроля уровня вложенности директорий можно использовать параметр /lev, например, /lev:3
Инкрементальность осуществляется за счёт параметра /maxage:1 — файлы старше суток копироваться не будут. Для первого, “базового” копирования, можно выполнить этот скрипт без параметра /maxage.
Заметка. Если файловые системы source или dest не являются NTFS, используйте ключ /FFT , так как на других файловых системах (включая эмулированные NTFS) может возникнуть ошибка, из-за которой robocopy будет видеть старые файлы как измененные, из-за отличий в метке времени.
Копирование с заменой и копирование с заменой read-only файлов
Copy-Item по умолчанию при копировании заменяет файлы в целевом каталоге. Никаких дополнительных параметров указывать не нужно. При копировании каталога, если нужно заменить каталог в целевой папке, нужно использовать ключ –Force, иначе будет ошибка “Элемент folder с указанным именем уже существует — DirectoryExists”.
Для перезаписи файла с атрибутом read-only, нужно использовать ключ -Force. Если его не использовать, вы получите ошибку “отказано в доступе по пути… CopyFileInfoItemUnauthorizedAccessError”.
Чтобы скопировать файл с перезаписью файла с read-only атрибутом используйте параметр Force.
Copy-Item -Path "C:\SourceFolder\1.txt" -Destination "F:\DestFolder\1.txt" -Force
Чтобы Copy-Item скопировал файлы из одной папки в другую без замены существующих файлов, можно использовать этот простой скрипт
Copy-Item (Join-Path "C:\SourceFolder\" "*") "F:\DestFolder\" -Exclude (Get-ChildItem "F:\DestFolder\") -Recurse
Этот скрипт скопирует все файлы и папки из C:\SourceFolder в F:\DestFolder без замены файлов уже существующих в F:\DestFolder
Как скачать файл по протоколу BITS с помощью PowerShell
Предполагается, что к данному URL адресу разрешен анонимный доступ (в дальнейшем мы рассмотрим доступ к URL адресу с аутентификацией).
В первую очередь загрузите в сессию PowerShell модуль поддержки BITS:
После загрузки модуля, вы можете вывести список всех доступных команд модуля BitsTransfer:
Как вы видите, доступно всего 8 командлетов:
- Add-BitsFile
- Complete-BitsTransfer
- Get-BitsTransfer
- Remove-BitsTransfer
- Resume-BitsTransfer
- Set-BitsTransfer
- Start-BitsTransfer
- Suspend-BitsTransfer
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
- Если вы используете ключ /MOVE с ключом /E, то вы перенесете все файлы, директории (включая файлы внутри них) и пустые директории. Файлы и директории удалятся из исходной папки. /MOVE с /S даст такой же результат, но пустые директории не перенесутся и будут удалены.
- Если вы используете ключ /MOV с ключом /E, то вы перенесете все файлы, включая те, которые находятся в директориях и поддиректориях, также скопируются все директории (включая пустые), но они не будут удалены из исходного каталога, в отличие от файлов. Используя /MOV с /S, вы получите такой же результат, но пустые директории не будут скопированы.
Копирование файлов и каталогов
Чтобы скопировать один файл 1.txt из каталога C:\SourceFolder\ в F:\DestFolder\, выполните:
Copy-Item -Path "C:\SourceFolder\1.txt" -Destination "F:\DestFolder\1.txt"
Можно использовать сокращенный синтаксис командлета, пропустив указание параметров Path и Destination:
cpi "C:\SourceFolder\1.txt" "F:\DestFolder\1.txt"
Теперь скопируем каталог C:\SourceFolder\folder в F:\DestFolder\folder. В папке folder находится файл 1.txt. Обратите внимание что без ключа –Recurse, папка folder копируется без содержимого:
Copy-Item -Path "C:\SourceFolder\folder" -Destination "F:\DestFolder\folder" -Recurse
С помощью Copy-Item также можно просто объединить файлы из несколько директорий в одну (слияние директории), для этого нужно перечислить директории в ключе –Path:
Copy-Item -Path "C:\SourceFolder\*", "C:\SourceFolder2\*", "C:\SourceFolder3\*" -Destination "F:\DestFolder\"
Копирование файлов на удаленный компьютер по сети
Copy-File может копировать не только по SMB протоколу, но и через WinRM (WSMan).
Создайте новую сессию с компьютером testnode1 и выполните копирование в её контексте:
$session = New-PSSession -ComputerName testnode1
Copy-Item -Path "C:\SourceFolder\*" -ToSession $session -Destination "C:\SourceFolder\" -Recurse -Force
Эта команда скопирует файлы с локального компьютера из директории C:\SourceFolder на компьютер testnode1 в C:\SourceFolder\.
Примечание. Доступность WSMan на удаленном компьютере можно проверить с помощью командлета Test-WSMan.
Test-WSMan -ComputerName testnode1
Если WSMan не настроен, вы можете выполнить его быструю конфигурацию. Для этого откройте командную строку с правами администратора и выполните winrm quickconfig
Также можно копировать и через обычные сетевые SMB шары, для этого просто используйте UNC формат сетевого пути.
Copy-Item -Path "C:\SourceFolder\*" -Destination "\\testnode1\C$\copy_tutorial\"
Можно скопировать файл с удаленного компьютера. Принцип такой же, как и при копировании файлов на удаленный компьютер, за исключением параметра –ToSession, вместо него нужно использовать –FromSession:
$session = New-PSSession -ComputerName testnode1
Copy-Item -FromSession $session -Path "C:\SourceFolder\*" -Destination "F:\DestFolder\" -Recurse -Force
Эта команда скопирует содержимое папки C:\SourceFolder\ с компьютера testnode1 на локальный компьютер в директорию F:\DestFolder
Несколько полезных скриптов с Copy-Item
Скопировать только файлы:
Get-ChildItem "C:\SourceFolder" -File -Recurse | Copy-Item -Destination "F:\DestFolder"
Скопировать структуру папок, без файлов:
$path = Get-ChildItem "C:\SourceFolder" -Recurse | ?
$dest = "F:\DestFolder\"
$parent = $path[0].Parent.Name
$path | foreach $_.FullName -match "$parent.+"
New-Item -ItemType directory ($dest + $Matches[0])
>
Copy-Item очень простой и удобный в использовании командлет PowerShell для выполнения операций копирования и перемещения файлов. В сочетании с другими инструментами PowerShell, Copy-Item также является мощным инструментом для написания скриптов.
27.04.2020
itpro
PowerShell, Windows 10, Windows Server 2012 R2
комментария 24
Используем BITS для асинхронного копирования больших файлов по сети
Процесс загрузки файлов через BITS можно запустить и в асинхронном режиме, для этого к рассмотренной выше команде нужно добавить параметр –asynchronous. В этом режиме, если что-то случится в процессе загрузки файла (перезагрузка сервера, клиента, обрыв канала связи и пр.), задание автоматически продолжится после восстановления доступности источника и загрузка файла продолжится с момента прерывания связи.
Важно. По умолчанию Start-BitsTransfer работает с приоритетом Foreground (наивысший из возможных). Предполагается, что загрузка файла, запущенная в этом режиме будет соревноваться с другими процессами за полосу пропускания канала. Чтобы избежать этого, нужно явно указать в качестве аргумента команды любой другой приоритет, например, -Priority low:
Асинхронное задание BITS выполняется в фоновом режиме, а на экран не выводится процесс выполнения команды загрузки файла. Статус задания BITS можно получить из консоли PowerShell с помощью команды Get-BitsTransfer:
Get-BitsTransfer | fl
Команда возвращает статус передачи (в данном случае видно, что передача окончена -Transferred), информацию о количестве переданных байт, общем размере файла, времени создания и завершения задания BITS.
Вы можете просмотреть статус всех заданий BITS, запущенных на компьютере, в табличной форме:
Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize
При использовании асинхронного режима передачи, в целевом каталоге создается временный файл с расширением TMP (по умолчанию скрыт в проводнике). Чтобы конвертировать его в исходный тип файла (который хранится на сервере-источнике), нужно выполнить команду Complete-BitsTransfer:
Задание загрузки BITS после этого считается завершенным и пропадает из списка заданий.
Вы можете загрузить локальный файл в общую сетевую папку на удаленном сервере. Для этого используется следующая команда (для удобства можно указать имя задания копирования):
Start-BitsTransfer -Source C:\iso\w101809.iso -Destination \\ekt-fs1\iso -Asynchronous -DisplayName CopyISOtoEKT
Чтобы временно приостановить задание BITS, выполните:
Get-BitsTransfer -Name CopyISOtoEKT | Suspend-BitsTransfer
Для продолжения задания используется командлет Resume-BitsTransfer:
Get-BitsTransfer -Name CopyISOtoEKT | Resume-BitsTransfer -Asynchronous
Вы можете добавить в задание BITS дополнительные файлы с помощью командлета Add-BitsFile:
Get-BitsTransfer -Name CopyISOtoEKT | Add-BitsFile -Source C:\iso\w10msu\* -Destination \\ekt-fs1\iso -Asynchronous
Чтобы удалить все задания загрузки BITS на компьютере (в том числе запущенные другими пользователями), выполните команду:
Вы не сможете отменить задания BITS, запущенные из-под System (ошибка 0x80070005 Unable to cancel job). Для отмены такого задания нужно выполнить команду Remove-BitsTransfer из-под SYSTEM.
Если сервер, на котором хранится файл, требует аутентификации пользователя, вы можете вызвать окно, в котором нужно указаны учетные данные для доступа к ресурсу:
Чтобы было удобнее отслеживать результаты выполнения задания BITS, можно воспользоваться простым скриптом, который отслеживает выполнение задания и раз в несколько секунд выводит процент выполнения загрузки на экран. По окончании загрузки файла, скрипт автоматически преобразует TMP файл в исходный формат:
Использование 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
- \\testnode1\C$\source\ — исходный каталог, откуда копируются файлы
- \\testnode2\C$\dest\ — каталог назначения, куда скопируются файлы
- *.txt – фильтр файлов. Синхронизируются только .txt файл и директории.
- /MIR – полное зеркалирование данных в source и dest директориях. Файлы, удаленные из source директории или не присутствующие в ней, также будут удалены из dest. Если вы хотите, чтобы удаленные из source файлы оставались в dest, то поменяйте параметр /MIR на /E
- /COPYALL – копирует всю информацию о файле (Атрибуты, параметры безопасности и т.д.). Как альтернатива, можно применять флаг /COPY:DT для копирования timestamp, а не всей информации. /COPALL требует прав администратора
- /Z – robocopy продолжит копирование файла при обрыве. Полезно при копировании больших файлов (неплохая альтернатива копированию файлов по BITS)
- /B – позволяет robocopy избегать ошибки access denied error. В этом режиме robocopy игнорирует все права на файлы, которые могли бы помешать прочитать/записать файл. Этот режим требует прав администратора либо участие в группе Операторы архива
- /J – Копирование без буфера (файлового кэша, оперативной памяти). Эффективно для больших файлов.
- /R:3 – количество попыток скопировать недоступный файл. Значение по умолчанию – миллион, поэтому необходимо его сменить.
- /W:1 – секунды между попытками скопировать недоступный файл. Значение по умолчанию – 30 секунд.
- /REG – сохранить текущие значения ключей /R и /W в реестр как стандартные, для будущих вызовов robocopy.
- /TEE – разделение вывода работы команды и в лог файл, и в консоль. При фоновом вызове robocopy (например, из планировщика задача) этот параметр можно убрать, оставив только /LOG
- /LOG – путь к файлу лога
Обратите внимание на ключ /Z даже если вы копируете небольшие файлы по устойчивому каналу. Он не несёт дополнительных расходов при использовании, но в случае обрыва, вы сможете продолжить копирование просто повторно запустив скрипт.
При копировании больших файлов (более 2 Гб) с некоторых iSCSI/SAN томов, процесс robocopy может существенно использовать оперативную память сервера. Проблем обычно связано с тем, что для данного LUN в настройках RAID используется write-through кэширование вместо write-back.
Синхронная передача файлов между компьютерами с помощью BITS
В данном примере командлет выполняет загрузку файла в синхронном режиме. Закачка файла напоминает обычную процедуру копирования через проводник или с помощью PowerShell командлета Copy-Item. При это на экран выводится прогресс бар, отображающий статус выполнения закачки. При перезагрузке компьютера, закачка возобновлена не будет (вам заново скачивать весь файл).
Пример использование robocopy в планировщике задач
Для примера возьмём задачу: нам необходимо с помощью robocopy регулярно синхронизировать содержимое сетевой папки между двумя серверами с ведением логов.
- Исходный путь — \\testnode1\C$\source
- Целевая директория- \\testnode2\C$\source
Запустите командную строку с правами администратора и введите: compmgmt.msc
Перейдите в System Tools -> Task Scheduler Library. Создайте новое задание планировщика (Create task).
Укажите имя задания, и выберите пользователя из-под которого будет выполняться задание. Пользователь должен иметь доступ на чтению и запись в обоих каталогах (при копировании по сети между серверами домена можно использовать аккаунт System, в этом случае нужно предоставить на целевой каталог права RW для объекта computer сервера-источника) .
Выберите опцию Run whether user is logged on or not, для того чтобы задание выполнялось в фоновом режиме. Также отметьте Run with highest privileges. Эта опция сработает если аккаунт из-под которого выполняется задание, будет иметь права администратора.
Перейдите на вкладку 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 на нужный вам путь.
Остальные настройки заполнять не надо. После нажатия на кнопку ОК, вас попросит ввести пароль от учетной записи, которую вы выбрали для запуска задания.
Если вы всё настроили правильно, директории должны начать синхронизироваться.
Если у вас возникли проблемы с выполнением скрипта, то обязательно проверьте вкладку History вашей задачи
BITS: требования к ОС и версии PowerShell
Протокол BITS впервые был представлен еще в Windows XP, для управления заданиями BITS в которой можно было использовать утилиту bitsadmin.exe. Утилита все еще поддерживается, однако считается устаревшей. Для управления заданиями BITS предпочтительно использовать специальные командлеты PowerShell.
Для работы по рассматриваемому сценарию нам потребуется ОС не ниже Windows Vista или Windows Server 2008, и PowerShell не ниже версии 2.0. Современные версии Windows 10 и Windows Server 2016 / 2012 R2 протокол BITS полностью поддерживают.
Совет. Возможно использовать и Windows Server 2003. В этом случае придется установить специальное обновлений KB 923845 и PowerShell V2.0.
Поддержка BITS требуется как на стороне клиента, так и сервера.
Читайте также: