Копируем пользовательские файлы с одного сервера на другой. Powershell + Robocopy
Всем привет из Пензы и всем Добра:)
Ребят, не нашел подходящего скрипта в Интернете, пришлось написать самому.
Задача: копировать данные из профиля пользователя с одного сервера в такой же профиль пользователя на другой сервер.
Т.е. есть два разных терминальных сервера на котором сидят одинаковые пользователи, соответственно имя профиля одно и тоже, сервер который основной выводим из работы, поэтому данные зеркалируем используя связку "/E","/PURGE".
Имеем одинаковые профили и одинаковые папки источника и назначения, типа "Мои документи" и "Рабочий стол", разные только сервера.
Чего может быть проще, только вот пользователей таких несколько десятков и в каждом профиле несколько папок.
Самый простой вариант это использовать robocopy, но эта утилита не поддерживает несколько путей в источнике и назначении, можно конечно было пойти по пути исключения папок и скрытых файлов, но это не решало проблему нескольких путей, т.е. как не крути выполнить задачу robocopy не может, поэтому подключаем всем нам известный Powershell 2.0
Да конечно, давайте, закидайте меня камнями за использование версии 2.0, но мне норм если что:)
Копируем файлы используя связку Powershell + Robocopy.
Всё просто, т.к. нам надо скопировать файлы из профиля пользователя, а они одинаковые на двух серверах, то создаем массив из имен пользователей, т.е. из имён профилей.
Далее создаем массив имён папок из которых и в которые надо перенести данные, они тоже одинаковые на двух серверах.
И последним этапом используя перебор foreach построчно копируем файлы для каждого профиля, получается так, берем один профиль и к нему применяем копирование каждой папки, в конце каждого копирования формируется лог файл с именем профиля и папки копирования.
Для выполнения сценария обязательно запустить Powershell ISE от имени администратора, потому что используем ключ robocopy /B.
Скрипт в студию:
$User = @(
"user"
"user2"
"user3"
"user4"
"user5"
"user6"
"user7"
"user8"
"user9"
"user10"
)
$Path = @(
"Downloads"
"Pictures"
"Videos"
"Music"
"Documents"
"Desktop"
)
$options = @("/E","/PURGE","/Z","/B","/COPYALL","/MT:16","/xa:h","/R:3","/W:3","/TEE")
# /E – копирует подпапки, без ограничения уровня вложенности. Для контроля уровня вложенности директорий можно использовать параметр /lev, например, /lev:3
# /PURGE :: Удалять файлы и папки назначения, которых больше не существует в источнике.
# /Z – robocopy продолжит копирование файла при обрыве. Полезно при копировании больших файлов (неплохая альтернатива копированию файлов по BITS)
# /B – позволяет robocopy избегать ошибки access denied error. В этом режиме robocopy игнорирует все права на файлы, которые могли бы помешать прочитать/записать файл. Этот режим требует прав администратора либо участие в группе Операторы архива
# /COPYALL :: Копировать все сведения о файле
# /MT[:n] :: Выполнить многопотоковое копирование с помощью n потоков(по умолчанию 8).
# /xa:h копировать файлы за исключением скрытых (/xa:h)
# /R:n :: число повторных попыток для неудавшихся копий: по умолчанию - 1 миллион.
# /W:n :: Время ожидания между повторными попытками: по умолчанию - 30 секунд.
# /LOG:файл :: Записывать состояние в файл журнала (перезаписывать существующий журнал).
# /LOG+:файл :: Записывать состояние в файл журнала (добавлять к существующему журналу).
# /TEE :: Направлять выходные данные в окно консоли и в файл журнала.
# /L - Это отобразит результат без фактического копирования или удаления каких-либо файлов или папок.
Foreach($User1 in $User)
{
foreach($Pathx in $Path)
{
$source = "C:\Users\$User1\$Pathx"
$dest = "\\server\C$\Users\$User1\$Pathx"
$log = "/LOG:C:\rob_log\$User1.$Pathx.txt"
robocopy $source $dest $options $log
}
}
Не забываем что возможно для подключения к удаленному серверу потребуются учетные данные администратора, поэтому перед выполнением сценария введите команду:
net use \\server\c$ /user:domen\admin
pass
Комментарии
Отправить комментарий