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

});

Antworten auf die Frage(1)

Ihre Antwort auf die Frage