1 1 1 1 1 1 1 1 1 1 Рейтинг 5.00 (1 голос)

Копирование/перемещение файлов и каталогов по событию

 

В данной статье мы рассмотрим задачу, которая была сформулирована так: "Хочется, что бы при помещении в какую либо папку  файла или файлов, эти данные были перемещены на другой файловый ресурс"

Решений как обычно несколько.

1. Проверять папку вручную, и при появлении там файла копировать в место назначения.

2. Написать скрипт который по расписанию, например в час ночи  переместит все данные в место назначения.

3. Использовать powershall  и непосредственно, сразу после копирования файла в папку, эти данные перемещаются в место назначения.

Третий вариант наиболее красивый  и правильный. Поэтому будем разбирать его.

Приблизим  задачу к практической реализации.

Существует организация, в которой много отделов. Каждый отдел периодически передает в отдел А данные для печати.   Цель - сотрудники каждого отдела копируют данные, предназначенные для печати, в свою подпапку, по этому событию срабатывает скрипт, и перемещает данные в папку отдела А, с информацией от какого отдела поступила информация и какого числа. 

Если диск где мы планируем работать, отформатирован в NTFS, то скрипт на языке PowerShall будет выглядеть так

Unregister-Event -SourceIdentifier "FileSystemWatcher.Created"
$watcher = New-Object system.io.FileSystemWatcher
$watcher.path = "E:\share$\_toA"
# Папка которую будем контролировать
$watcher.filter = "*.*"
# на какие файлы будет срабатывать скрипт. В данном примере  на все файлы, но можно например только на pdf (*.pdf)
$watcher.IncludeSubdirectories = $true
# включаем возможность отслеживать событие в под директориях относительно корневой папки  описанной в переменной $watcher.path
$watcher.EnableRaisingEvents = $true
# включаем отслеживание по событию, размещения файла
Register-ObjectEvent $watcher "Created" -SourceIdentifier "FileSystemWatcher.Created" -Action {
# этот блок отвечает за команды которые будут выполнятся в случае наступления события
 $path = $Event.SourceEventArgs.FullPath
# читаем полный путь тех данных которые пользователь разместил
 $name = $Event.SourceEventArgs.Name
#читаем путь относительно корневой папки
 $otdels=$name.split("\")
# заносим в массив части пути(что были разделены  слешем)
 $fifi=$otdels[0]
 $dat=Get-Date -format d
# записываем в переменную текущую дату
 $destination="E:\ОтделА\$fifi($dat)"
# формируем новый пункт назначения куда будут перемещенны данные
 New-Item -ItemType Directory -Force -Path $destination
#создается директория, если её еще нет.
 Start-Sleep -Seconds 2
# ожидаем 2 секунды
 Move-Item $path -Destination $destination # Force will overwrite files with same name
# перемещаем полученные данные в пункт назначения
}

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

Конечным результатом, является  созданием в папке отдела А директориии ОтделБ(20.12.2015) в котором будут находится файлы/каталоги которые были скопированы Отделом Б в свою папку.

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

И не важно что сотрудник, положивший данные в папку, через секунду (в нашем примере более через 2 секунды) удалил его.  Этот файл уже будет скопирован (если будем использовать Copy-Item) на тот или иной удаленный ресурс/диск.

Возможно кому то пригодится этот скрипт.

Удачных расчетов!