PowerShell überwacht mehrere Verzeichnisse
Hinweis: Ausführen von PowerShell v3
Ich habe ein aktuelles Verzeichnis eingerichtet:
\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
Jeder FTP-Benutzer ist einem eingehenden Verzeichnis zugeordnet. Die Struktur kann geändert werden, wenn dies die Lösung erleichtert
\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
Ich muss jedes eingehende Verzeichnis auf TIFF-Dateien überwachen und neue FTP-Benutzer und eingehende Verzeichnisse abrufen, wenn sie hinzugefügt werden (entsprechend derselben Struktur), damit ich nicht das Skript für jeden neuen Benutzer ändern möchte.
Das Skript ist derzeit wie folgt:
$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"
}
Ich verpacke den New-Object IO.FileSystemWatcher in eine Schleife, sodass im obigen Beispiel nur das letzte Verzeichnis überwacht wird.
Ist es möglich, ein Array oder eine Liste oder ähnliches von IO.FileSystemWatcher zu erstellen? Und wenn ja, wie kann ich das Register-ObjectEvent für jede Instanz codieren? Es werden am Ende über hundert Verzeichnisse zu überwachen sein (und langsam zunehmen), aber die gleiche Aktion gilt für alle eingehenden Ordner.
Oder gibt es eine bessere Lösung, die ich untersuchen sollte?
Der Vorgang ist für jeden FTP-Benutzer der gleiche, die Dateien müssen sich in Verzeichnissen befinden, die mit dem Benutzer verknüpft werden können. Das eingehende Verzeichnis wird auf hochgeladene TIFF-Dateien überwacht. Wenn eine Datei erkannt wird, wird eine mehrseitige TIFF-Datei in einzelne Dateien aufgeteilt und in das konvertierte Verzeichnis verschoben. Wenn eine neue Datei in der konvertierten Datei erkannt wird, wird eine weitere Aktion für die TIFF-Datei ausgeführt Es wird in PDF konvertiert und in den PDF-Ordner verschoben.
Danke
Lösung
$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 };
});