В данной статье мы рассмотрим задачу, которая была сформулирована так: "Хочется, что бы при помещении в какую либо папку файла или файлов, эти данные были перемещены на другой файловый ресурс"
Решений как обычно несколько.
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) на тот или иной удаленный ресурс/диск.
Возможно кому то пригодится этот скрипт.
Удачных расчетов!
|
Копирование файлов по событию |
2015-12-02 07:18:08 |
Варламов Дмитрий |
Сеть |
Копирование или перемещение файлов и каталогов по событию. Скрипт на языке PowerShall. |
powershall, копирование, папка, перемещение, событие
|