2017-02-09 2 views
1

Ich habe ein Skript basierend auf New-Objekt System.IO.FileSystemWatcher, der einen Ordner auf meinem Home-Dateiserver für neue Dateien überwacht und eine externe App, aber jetzt ausgeführt Ich freue mich auf die Verwendung von New-Object System.IO.FileSystemWatcher, um eine Reihe von mehreren Servern (Eingabe von einem .csv) zu überwachen.New-Objekt System.IO.FileSystemWatcher mehrere Server

Ich habe den folgenden Code funktioniert bis zur Erkennung der Ereignisse, aber es generiert eine Warnung für eine neue Datei mehrmals, wenn neue Dateien erkannt werden. Irgendeine Idee, wie ich es bekommen könnte, nur eine Warnung generieren? Ich denke, so ist meine Schleife aufgebaut?

Jede Hilfe wird geschätzt!

$Servers = import-csv "C:\Scripts\Servers.csv" 

while($true) { 

ForEach ($Item in $Servers) { 

# Unregister-Event $changed.Id -EA 0 
$Server = $($Item.Server) 
write-host "Checking \\$Server\c$\Scripts now" 

#$folder = "c\Scripts" 
$filter = "*.html" 

$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "\\$Server\c$\Scripts\" 
$watcher.Filter = "*.html" 
$watcher.IncludeSubdirectories = $False 
$watcher.EnableRaisingEvents = $true 

     $created = Register-ObjectEvent $watcher "Created" -Action { 
     write-host "A new file has been created on $Server $($eventArgs.FullPath) -ForegroundColor Green 

    } 

} #ForEach 

write-host "Monitoring for new files. Sleeping for 5 seconds" 
Start-Sleep -s 5 

} #While 

Hier ist die einzige Server-Version von meinem Skript, im Grunde, ich möchte die gleiche Sache zu tun, außer laufen gegen eine Reihe von Servern:

$SleepTimer = 15 
$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "\\FILESERVER\NEWSTUFF\" 
$watcher.Filter = "*.html" 
$watcher.IncludeSubdirectories = $true 
$watcher.EnableRaisingEvents = $true 

### DEFINE ACTIONS AFTER A EVENT IS DETECTED 
$action = { 
$path = $Event.SourceEventArgs.FullPath 
$changeType = $Event.SourceEventArgs.ChangeType 
$logline = "$changeType, $path" 
write-host "$LogLine created" 

**RUN EXTERNAL PROGRAM HERE** 

add-content -Value $LogLine -path "\\Fileserver\Log.txt" 

}  

### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY 
$created = Register-ObjectEvent $watcher "Created" -Action $action 

while ($true) { 
write-warning "no new files detected. Sleeping for $SleepTimer seconds ..." 
start-sleep -s $SleepTimer 
} 
+0

Entschuldigung, ich hätte klarer sein sollen. Ich erhalte mehrere Benachrichtigungen für den gleichen Server und die erstellte Datei. Wenn ich die einzelne Version des Skripts ausführe, erhalte ich nur die eine Warnung pro Server, bis eine neue Datei erstellt wird. – Kenny

+0

Ok. Wie würde ich neu anordnen/neu schreiben, so dass ich nur eine Warnung für jede neue Datei, die auf dem Server erstellt wurde, erhalte, aber ich kann sie auf unbestimmte Zeit laufen lassen? – Kenny

+0

Ich habe meine Single-Server-Version zu meinem ursprünglichen Beitrag hinzugefügt: – Kenny

Antwort

1

denke ich jedes Mal, wenn die while-Schleife ausgeführt wird, wird neuer Filesystemwatcher erstellt, die die mehrere Alarme erzeugen .which von Skript in Ihrer Einzelserverversion geschieht nicht

können Sie dies überprüfen:

$Servers = import-csv "C:\Scripts\Servers.csv" 

ForEach ($Item in $Servers) { 

# Unregister-Event $changed.Id -EA 0 
$Server = $($Item.Server) 
write-host "Checking \\$Server\c$\Scripts now" 

#$folder = "c\Scripts" 
$filter = "*.html" 

$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "\\$Server\c$\Scripts\" 
$watcher.Filter = "*.html" 
$watcher.IncludeSubdirectories = $False 
$watcher.EnableRaisingEvents = $true 

     $created = Register-ObjectEvent $watcher "Created" -Action {write-host "A new file has been created on $Server $($eventArgs.FullPath)" -ForegroundColor Green} 

} 


while($true) { 
write-host "Monitoring for new files. Sleeping for 5 seconds" 
Start-Sleep -s 5 

} #While 
+0

Das war's! SUPER EINFACHES FIX! Ich danke dir sehr :-) – Kenny

Verwandte Themen