Powershell + Robocopy Автоматическое резервное копирование выполняется несколько раз

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

Я также настроил уведомление по электронной почте.

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

Ниже вы можете увидеть код, надеюсь, вы поможете мне понять, что происходит.

#The Script
$folder = 'C:\_Using Last Template Approach\' # Enter the root path you want to monitor.
$filter = '' # You can enter a wildcard filter here.

# In the following line, you can change 'IncludeSubdirectories to $false if required. 
$fsw = New-Object IO.FileSystemWatcher $folder -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

Register-ObjectEvent $fsw Changed -SourceIdentifier AutoBackUp -Action {
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$datestamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"
$Computer = get-content env:computername
$Body = "Documents Folders have been backed up"
robocopy "C:\_Using Last Template Approach" G:\BackUp\  /v /mir /xo /log:"c:\RobocopyLog.txt"
Send-MailMessage -To "[email protected]" -From "[email protected]" -Subject $Body -SmtpServer "smtp-mm.me.com" -Body " "


# To stop the monitoring, run the following commands (e.g using PowerShell ISE:
# Unregister-Event AutoBackUp
}

person Martin    schedule 18.04.2015    source источник
comment
Интересно, запускает ли Robocopy это каким-то образом.. Также вы ничего не делаете с $changeType, возможно, ответ находится там, и простой if решит его за вас.   -  person Matt    schedule 18.04.2015
comment
Привет, Мэтт. Спасибо за ответ. Я могу использовать дополнительные переменные в теле письма, чтобы получить более подробную информацию о событии изменения файла. Если я запущу только две последние строки сценария, то есть robocopy и Send-MailMessage, я получу только одно электронное письмо, как и ожидалось, и журнал robocopy покажет, что он действительно скопировал или удалил один файл, в зависимости от того, что Я сделал с любым из файлов в исходном каталоге. Это похоже на то, что эти две строки выполняются один раз для каждого уровня исходного дерева каталогов.   -  person Martin    schedule 18.04.2015
comment
Кто-то еще мог бы вмешаться, но я просто меняю одну строку в файле, и триггер срабатывает дважды для меня. Будет расследовать. Я не использую robocopy и не отправляю почту. просто простой хост записи   -  person Matt    schedule 18.04.2015
comment
Это многократное срабатывание, по-видимому, является обычным явлением ... поиск файловой системы, запущенный дважды, дает много результатов.   -  person Matt    schedule 18.04.2015
comment
Стоит прочитать... Посмотрите также комментарии: .com/questions/12940516/. Также такие вещи, как блокнот, дважды срабатывают при сохранении файла. Это может быть просто то, как ваша система изменяет файлы.   -  person Matt    schedule 19.04.2015
comment
Еще раз спасибо, Мэтт. Это, безусловно, связано с тем, как класс FileSystemWatcher смотрит на изменения в файле Fs. Я посмотрю, как обойти это и заставить robocopy запускаться только один раз.   -  person Martin    schedule 19.04.2015


Ответы (1)


я не меняю ваш сценарий монитора, просто измените отправку почты и скопируйте с помощью команды powershell copy-item

$folder = 'c:\sites' # Enter the root path you want to monitor. 
$filter = '*.*'  # You can enter a wildcard filter here. 

# In the following line, you can change 'IncludeSubdirectories to $true if required.                           
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 
Write-Host "The file '$name' was $changeType at $timeStamp" -fore white 
Out-File -FilePath c:\sites\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"
$username=”gmailaccount”
$password=”password”
$smtpServer = “smtp.gmail.com”
$msg = new-object Net.Mail.MailMessage
$smtp = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$smtp.EnableSsl = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential( $username, $password )
$msg.From = "gmail"
$msg.To.Add(“mail should check notify”)
$msg.Body=”Please See archive for notification”
$msg.Subject = “backup information”
$files=Get-ChildItem “c:\sites\filechange\”
Foreach($file in $files)
{
Write-Host “Attaching File :- ” $file
$attachment = New-Object System.Net.Mail.Attachment –ArgumentList S:\sites\filechange\$file
$msg.Attachments.Add($attachment)
}
$smtp.Send($msg)
$attachment.Dispose();
$msg.Dispose();
Copy-Item c:\sites\$name C:\a\$name } 

я проверяю, что этот сценарий работает для меня, если изменить содержимое файла файла первого файла журнала электронной почты, а затем скопировать их в место назначения c:\a\ также вы и этот файл изменились на вложение почты

person Soheil Hashemi    schedule 18.04.2015
comment
Привет, Сохейл. Спасибо за ответ. Я попробую, хотя мне нужно синхронизировать две копии всего дерева каталогов, поэтому я использую robocopy. Я дам вам знать, когда буду тестировать ваши скрипты. Спасибо еще раз. - person Martin; 19.04.2015
comment
@Martin, вы можете скопировать несколько файлов, только сначала вы должны использовать get-childitem, а затем передать весь файл для копирования элемента, например get-childitem -path "SOURCE\PATH" -filter *.txt -recurse | copy-item -destination "DESTINATION\PATH" - person Soheil Hashemi; 19.04.2015