Мониторинг и копирование в и из нескольких мест - PullRequest
0 голосов
/ 04 мая 2018

Попытка автоматического копирования файлов с одного компьютера (не подключенного к сети) в сетевое местоположение с использованием моста с двумя сетевыми картами.

Мне удалось собрать этот сценарий из предыдущего поста на эту тему. Это прекрасно работает!

Проблема, с которой я столкнулся, заключается в том, что мне нужно отслеживать и копировать файлы из двух мест на ПК в два отдельных места на мостовом ПК

C: \ Source & rarr; C: \ Destination

и

C: \ Source2 & rarr; C: \ Destination2

Я попытался запустить 2 скрипта PowerShell с разными источниками и назначениями, однако он не позволяет второму запускаться, пока работает первый. Появляется следующее сообщение об ошибке:

Register-ObjectEvent : Cannot subscribe to the specified event. A subscriber
with the source identifier 'FileCreated' already exists.
At ****\PowerShell\movePowerhell - Copy.ps1:8 char:14
+ ... onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileC ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (System.IO.FileSystemWatcher:FileSystemWatcher) [Register-ObjectEvent], ArgumentException
    + FullyQualifiedErrorId : SUBSCRIBER_EXISTS,Microsoft.PowerShell.Commands.RegisterObjectEventCommand

Я полагаю, мне нужно отслеживать оба местоположения и копировать в оба места назначения в одном и том же сценарии?

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

$folder = "C:\Source"
$filter = "*.*"
requirements
$destination = "C:\Destination"
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated

    Move-Item $path -Destination $destination -Force -Verbose # Force will overwrite files with same name
}

1 Ответ

0 голосов
/ 04 мая 2018

Если есть сомнения, прочитайте документацию (выделено мной):

-SourceIdentifier

Указывает имя, которое вы выбираете для подписки. Выбранное вами имя должно быть уникальным в текущем сеансе. Значением по умолчанию является GUID, назначаемый Windows PowerShell.

Самый простой способ избежать этой проблемы - не указывать идентификатор источника. Если этот параметр не указан, PowerShell автоматически установит GUID в качестве идентификатора источника, что позволит избежать конфликтов имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...