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