2016-05-17 9 views
0

Ich versuche, diese Abfrage in Powershell auszuführen, aber wenn ich es mit dem aktuellen $MonitorFolder als \\\vavm\CINICO\Incoming ausführen meine Arbeit funktioniert nicht beim Hinzufügen einer Datei in den Ordner. Wenn ich die Variable $MonitorFolder zu C:\Users\RickG\Desktop\Test Reports ändere, funktioniert mein Code gut, wenn ich die Datei dem Ordner hinzufüge. Also, wie überwache ich den Pfad \\vavm\CINICO\Incoming, wenn Dateien zum Ordner hinzugefügt werden.Monitor Netzwerkordner für Dateien

Hier ist ein Ausschnitt aus meinem ersten Teil des Codes, der den Ordner überprüft:

$MonitorFolder = "\\vavm\CINICO\Incoming" 
$MonitorStopFile = "monitor.die" 
$smtpServer = "mail.test.org" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 


$SourceID = "MonitorFiles" 

$smtpSubject = "New file arrived in $($MonitorFolder)" 
$Query = @" 
SELECT * FROM __InstanceCreationEvent WITHIN 10 
WHERE targetInstance ISA 'Cim_DirectoryContainsFile' 
AND targetInstance.GroupComponent = 'Win32_Directory.Name="$($MonitorFolder.Replace("\", "\\\\"))"' 
"@ 

LÖSUNG:

$MonitorFolder = "\\vavm\CINICO\incoming" 
$MonitorStopFile = "monitor.die" 

$smtpServer = "mail.test.org" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$smtpSubject = "New file arrived in $($MonitorFolder)" 
$SourceID = "MonitorFiles" 
$IncomingFiles = Get-ChildItem $MonitorFolder 

$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer 

$watcher = New-Object System.IO.FileSystemWatcher $MonitorFolder 
#Files only. Default is files + directory 
$watcher.NotifyFilter = [System.IO.NotifyFilters]'FileName,LastWrite' 

$newFileSubscription = Register-ObjectEvent -InputObject $watcher -EventName Created -SourceIdentifier NewFileCreated -Action { 
Write-Host "New file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)" 

$smtpBody += "`n[$(Get-Date -Format HH:mm:ss)]`tNew file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)" 

if($Event.SourceEventArgs.Name -eq $MonitorStopFile) { 
    Write-Host "Monitoring stopped" 
    #Stop monitoring 
    Unregister-Event -SubscriptionId $newFileSubscription.Id 
    #Dispose FileSystemWatcher 
    $watcher.Dispose() 
} 
$smtp.Send($smtpFrom, $smtpTo, $smtpSubject, $smtpBody)  
} 
+0

was meinst du mit "funktioniert nicht"? erhalten Sie einen Fehler? –

+0

Das Beispiel ist unvollständig. Sie registrieren nie den WMI-Ereignissubscriber –

+0

Ich registriere das wmi-Ereignis im vollen Code, ist also nur ein Schnipsel – SikRikDaRula

Antwort

2

Ich bin 99% sicher __InstanceCreationEvent nicht Remote-Freigaben nicht unterstützt. WMI-Ereignisse werden von Ihrem Computer ausgelöst, auch wenn Sie nichts abonniert haben. Ihr Computer kann niemals Fileshare im Netzwerk überwachen.

Sie sollten System.IO.FileSystemWatcher versuchen, Remote-Freigaben zu überwachen. Ex.

$MonitorFolder = "\\vavm\CINICO\Incoming" 
$MonitorStopFile = "monitor.die" 

$smtpServer = "mail.test.org" 
$smtpFrom = "[email protected]" 
$smtpTo = "[email protected]" 
$smtpSubject = "New file arrived in $($MonitorFolder)" 
$SourceID = "MonitorFiles" 

$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer 

$watcher = New-Object System.IO.FileSystemWatcher $MonitorFolder 
#Files only. Default is files + directory 
$watcher.NotifyFilter = [System.IO.NotifyFilters]'FileName,LastWrite' 

#Using a thread-safe collection (in global scope so Action-block can reach it) to store the log just to be safe. 
$global:newFiles = [System.Collections.ArrayList]::Synchronized((New-Object System.Collections.ArrayList)) 

$newFileSubscription = Register-ObjectEvent -InputObject $watcher -EventName Created -SourceIdentifier NewFileCreated -Action { 
    Write-Host "New file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)" 
    $global:newFiles.Add("[$(Get-Date -Format HH:mm:ss)]`tNew file named '$($Event.SourceEventArgs.Name)' arrived in $($MonitorFolder)") 

    if($Event.SourceEventArgs.Name -eq $MonitorStopFile) { 
     Write-Host "Monitoring stopped" 
     #Stop monitoring 
     Unregister-Event -SubscriptionId $newFileSubscription.Id 
     #Dispose FileSystemWatcher 
     $watcher.Dispose() 
    } 
} 

while ($watcher.EnableRaisingEvents -or $global:newFiles.Count -gt 0) { 

    #Sleep 
    Start-Sleep -Seconds 60 

    if($global:newFiles.Count -gt 0) { 
     #Convert list of strings to single string (multiline) 
     $smtpbody = $global:newFiles | Out-String 

     $smtp.Send($smtpFrom, $smtpTo, $smtpSubject, $smtpBody) 

     #Mail sent, Empty array 
     $global:newFiles.Clear() 
    } 

} 

die Probe oben mit einem Thread-sichere globalen Arraylist Aktualisierte die „NewFiles“ -log in und eine while-Schleife speichern eine Mail je Minute, wenn es neue Einträge im Protokoll zu erstellen.

+0

Nicht sicher, wie man den Systemdateibeobachter mit meinem Code benutzt und wo man es setzt, ich bin ein Neuling zu Powershell, jede mögliche Hilfe mit einem Beispiel einschließlich meines Codes würde geschätzt werden ..... Gerade gesehen den Code, den Sie vorausgesetzt, ich werde versuchen, wenn ich nach Hause komme .. – SikRikDaRula

+0

Ich habe mit einer Probe aktualisiert. Ein Dateisystemwächter würde genauso funktionieren wie ein wmi-Ereignis. Sie richten die Überwachung ein und fügen eine Aktion ein, die für das Ereignis ausgeführt werden soll. Nichts anderes. Siehe Beispiel –

+0

Ok Ich habe das funktioniert mit dem Senden einer E-Mail, aber wenn ich drei Dateien im Ordner fallen lassen, sendet es 3 E-Mails, ich möchte nur eine E-Mail senden, wenn mehrere Dateien in Ordner gezogen wurden, habe ich meine Frage mit bearbeitet Der Arbeitscode in der Lösung: – SikRikDaRula