Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Условия для копирования. (http://forum.oszone.net/showthread.php?t=345483)

tubxtru 10-06-2020 02:49 2924571

Условия для копирования.
 
Доброго времени суток. На самом деле я не смыслю в написании скриптов и поэтому прошу Вашей помощи.
Нужен скрипт который будет анализировать папку 1 и папку 2 (Папка 1 находится на одном компьютере, а папка 2 на другом. Компы в одной сети). Если в папке 1 нет данных, а в папке 2 есть данные, то из папки 2 начинается копирование файлов в папку 1 с последней датой изменения файла. (т.е. есть файлы 22.05 и 22.06 копирование файла произойдет 22.06). Если в папке 1 есть данные и в папке 2 есть данные, то начинается сверка файлов по дате, если в папке 1 старее файлы чем в папке 2, то файлы в папке 1 удаляются, после чего идет копирование файлов в папку 1 (опять же с последней датой изменения).

Не судите строго я еще зеленый.

DJ Mogarych 10-06-2020 09:58 2924584

То есть, папка 1 должна быть точной копией папки 2?

Busla 10-06-2020 11:14 2924592

tubxtru, вам лучше ПО для синхронизации какое-нибудь посмотреть.

lev0tsk 10-06-2020 14:04 2924601

tubxtru

Просто средствами скриптов это, наверное, проблематично сделать...(((
Я для подобных задач (по сути, это односторонняя синхронизация папки 1 с папкой 2) использую nnbackup.exe от
nncron.
nnbackup.exe - command-line утилита, подключаем сетевой диск и CMD-шник типа такого (у меня такая строка параметров):

Код:

Set In=C:\papka-2
Set Out=U:\papka-1
Set NameLog="имя-лог-файла"

"C:\nnBackup\nnbackup.exe" sync -i %In% -o %Out% -tc -t2 -ad -s -v -e -delete-before -log C:\Temp\%NameLog%_%Date%.log

У утилиты довольно широкие возможности по резервному копированию и синхронизации, поэтому при адаптации утилиты под свои нужды лучше обратиться к её документации.

DJ Mogarych 10-06-2020 21:27 2924631

nncron был хорош во времена Windows XP, сейчас в нём смысла никакого, да и польская нотация - это на большого любителя.
Для синхронизации и копирования очень хорошо подходит robocopy.

Синхронизировать папки 1 -> 2 можно так:
Код:

robocopy c:\1 c:\2 /MIR

greg zakharov 10-06-2020 22:53 2924640

Цитата:

Цитата lev0tsk
Просто средствами скриптов это, наверное, проблематично сделать...

Вы само очарование наивности. Если бы было четкое описание сути задачи, а также пояснение ее нюансов, вы бы давно получили заветный пирожок (стряхнули пыль и положили бы обратно на полочку). А так... так, пожалуй, следует прислушаться DJ Mogarych, robocopy вполне может послужить отправной точкой в решении вашей задачи.

tubxtru 11-06-2020 01:19 2924648

Извините господа. Это я не правильно понял задачу. И не правильно ее изложил Вам.

На сервере каждый день формируется бэкап. Этот бэкап нужно перекинуть на 2 харда. Еще раз попробую выложить свое понимание ситуации: если на диске 1 и 2 нет бэкапа, то бэкап записывается на оба, если на диске 1 есть бэкап, а на диске 2 его нет то пишется на 2 диск. Т.е. бэкап на 1 диске остается старым. (как резервная копия) Если на диске 1 и 2 уже есть бэкапы, то определяется самый старый, а из предыдущего условия самый старый бэкап остался на диске 1, то происходит удаление старого бэкапа с диска 1 и начинается запись свежего. Т.е. теперь бэкап на диске 2 уже становится старым ну и аналогично дальше.

Опять же для всего этого нужен лог файл где написано имя бэкапа машины дата время начала копирования и так же окончание копирования.

#---задаем имя машины и каталоги резервного копирования, каталог логирования, записываем время начала
$VMName ="1cs"
$log ="C:\Scripts\logs\" + $VMName+ ".log"
$data = Get-Date -Format "dddd MM/dd/yyyy HH:mm"
$VMName+" --- START --- "+$data >> $log
$txt1 = "\\pk1\F$\pk7\1sc.txt"
$txt2 = "\\pk2\R$\pk7\1sc.txt"
$istxt1 = Test-Path $txt1
$istxt2 = Test-Path $txt2
if ($istxt1 -eq "True" -and $istxt2 -ne "True")
#===================================
$BackupPath=$BackupDisk+$VMName
Get-ChildItem -Path $BackupPath -Include * | remove-Item -recurse
#---Проверяем наличие папки назначения, если нет, то создаем
if (!(Test-Path $BackupPath)){md $BackupPath}
$data = Get-Date -Format "dddd MM/dd/yyyy HH:mm"
$VMName+" --- FINISH --- "+$data >> $log

я не знаю может это чем поможет но это у меня как образец...

{
New-Item -Path "\\pk1\R$\pk7\" -name 1sc.txt -type "file"
$BackupDisk = "\\pk2\R$\pk7\"
Remove-Item -Path $txt1
}elseif ($istxt2 -eq "True" -and $istxt1 -ne "True")
{
New-Item -Path "\\pk1\F$\pk7\" -name 1sc.txt -type "file"
$BackupDisk = "\\pk2\F$\pk7\"
Remove-Item -Path $txt2
}elseif ($istxt2 -eq "True" -and $istxt1 -eq "True")
{
$file1 = Get-Item $txt1
$file2 = Get-Item $txt2

if ($file1.LastWriteTime -gt $file2.LastWriteTime)
{
$BackupDisk = "\\pk2\R$\pk7\"
Remove-Item -Path $txt1
}else
{
$BackupDisk = "\\pk1\F$\pk7\"
Remove-Item -Path $txt2
}
}elseif($istxt1 -ne "True" -and $istxt2 -ne "True"){
New-Item -Path "\\pk2\R$\pkr7\" -name 1sc.txt -type "file"
$BackupDisk = "\\pk2\R$\pkr7\"
}


Время: 23:34.

Время: 23:34.
© OSzone.net 2001-