Powershell контролирует несколько каталогов

Примечание. Запуск PowerShell v3

У меня есть настройка каталога, которая в настоящее время:

\ftproot\001\converted
\ftproot\001\inbound
\ftproot\001\pdf

\ftproot\002\converted
\ftproot\002\inbound
\ftproot\002\pdf

\ftproot\xxx\converted
\ftproot\xxx\inbound
\ftproot\xxx\pdf

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

\ftproot\converted\001
\ftproot\converted\002
\ftproot\converted\xxx

\ftproot\inbound\001
\ftproot\inbound\002
\ftproot\inbound\xxx

\ftproot\pdf\001
\ftproot\pdf\002
\ftproot\pdf\xxx

Мне нужно отслеживать каждый входящий каталог на наличие файлов TIFF и подбирать новых пользователей FTP и входящие каталоги по мере их добавления (следуя той же структуре), поэтому я не собираюсь изменять скрипт для каждого нового пользователя.

Сценарий в настоящее время похож на:

$fileDirectory = "\ftproot";
$folderMatchString = "^[0-9]{3}$";
$inboundDirectory = "inbound";
$filter = "*.tif";

$directories = dir -Directory $fileDirectory | Where-Object {$_.Name -match $folderMatchString}

foreach ($directory in $directories) { 

  $sourcePath = "$fileDirectory\$directory\$inboundDirectory"

  if(Test-Path -Path $sourcePath -pathType container ) { 

        // Problem is here //
        $fsw = New-Object IO.FileSystemWatcher $sourcePath, $filter -Property @{
            IncludeSubdirectories = $false
            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

 Write-Host "The file '$name' was $changeType at $timeStamp"

}

Я оборачиваю IO.FileSystemWatcher New-Object в цикл, поэтому в случае приведенного выше примера будет отслеживаться только последний каталог.

Можно ли создать массив или список или аналог IO.FileSystemWatcher? И если так, как я могу кодировать Register-ObjectEvent для каждого экземпляра? В конечном итоге будет отслежено более ста каталогов (и медленно их увеличивать), но то же действие применяется ко всем входящим папкам.

Или есть лучшее решение, которое я должен исследовать?

Процесс одинаков для каждого пользователя FTP, файлы должны быть указаны в каталогах, которые могут быть связаны с пользователем. Входящий каталог будет отслеживаться для загруженных файлов TIFF, при обнаружении файла многостраничный TIFF разделяется на отдельные файлы и перемещается в преобразованный каталог, при обнаружении нового преобразованного файла выполняется другое действие над файлом TIFF, затем он конвертируется в PDF и перемещается в папку PDF.

Спасибо

Решение

$result = @($directoriesOfInterest | ? { Test-Path -Path $_ } | % {

$dir = $_;

$fsw = New-Object IO.FileSystemWatcher $dir, $filter -Property @{
            IncludeSubdirectories = $false
            NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
        };

$oc = Register-ObjectEvent $fsw Created -Action {

 $path = $Event.SourceEventArgs.FullPath;
 $name = $Event.SourceEventArgs.Name;
 $changeType = $Event.SourceEventArgs.ChangeType;
 $timeStamp = $Event.TimeGenerated;

 Write-Host "The file '$name' was $changeType at $timeStamp";

};

new-object PSObject -Property @{ Watcher = $fsw; OnCreated = $oc };

});

Ответы на вопрос(1)

Ваш ответ на вопрос