Powershell supervisa varios directorios
Nota: Ejecutar PowerShell v3
Tengo una configuración de directorio que actualmente es:
\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 usuario FTP se asigna a un directorio entrante. La estructura se puede cambiar si esto facilita la solución
\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
Necesito monitorear cada directorio entrante para archivos TIFF y elegir nuevos usuarios FTP y directorios entrantes a medida que se agregan (siguiendo la misma estructura), por lo que no estoy buscando modificar el script para cada nuevo usuario.
El guión es actualmente 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"
}
Estoy envolviendo el New-Object IO.FileSystemWatcher en un bucle, por lo que en el caso del ejemplo anterior, solo se supervisará el último directorio.
¿Es posible crear una matriz o lista o similar de IO.FileSystemWatcher? Y si es así, ¿cómo puedo codificar el Register-ObjectEvent para cada instancia? Habrá más de cien directorios para monitorear al final (y un aumento lento), pero la misma acción se aplica a todas las carpetas entrantes.
¿O hay una mejor solución que debería investigar?
El proceso es el mismo para cada usuario de FTP, los archivos deben decir dentro de los directorios que se pueden vincular de nuevo al usuario. El directorio entrante será monitoreado para detectar archivos TIFF cargados, cuando se detecta un archivo, un TIFF de varias páginas se divide en archivos individuales y se mueve al directorio convertido, cuando se detecta un nuevo archivo convertido, se realiza otra acción en el archivo TIFF, luego se convierte a PDF y se mueve a la carpeta PDF.
Gracias
Solución
$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 };
});