O Powershell monitora vários diretórios

Nota: Executando o PowerShell v3

Eu tenho uma configuração de diretório que é atualmente:

\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

Cada usuário de FTP é mapeado para um diretório de entrada. A estrutura pode ser alterada se isso facilitar a solução

\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

Preciso monitorar cada diretório de entrada em busca de arquivos TIFF e capturar novos usuários de FTP e diretórios de entrada à medida que são adicionados (seguindo a mesma estrutura), por isso não pretendo modificar o script para cada novo usuário.

Atualmente, o script é como:

$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"

}

Estou agrupando o IO.FileSystemWatcher de novo objeto em um loop, portanto, no caso do exemplo acima, apenas o último diretório será monitorado.

É possível criar uma matriz ou lista ou similar do IO.FileSystemWatcher? E se sim, como posso codificar o Register-ObjectEvent para cada instância? No final, haverá mais de cem diretórios para monitorar (e aumentará lentamente), mas a mesma ação se aplica a todas as pastas de entrada.

Ou existe uma solução melhor que eu deva investigar?

O processo é o mesmo para cada usuário de FTP, os arquivos precisam dizer nos diretórios que podem ser vinculados ao usuário. O diretório de entrada será monitorado para arquivos TIFF carregados, quando um arquivo for detectado, um TIFF de várias páginas será dividido em arquivos individuais e movido para o diretório convertido. Quando um novo arquivo for detectado em outra conversão, será executada outra ação no arquivo TIFF. é convertido em PDF e movido para a pasta PDF.

Obrigado

Solução

$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 };

});