监控文件的网络文件夹

Monitor Network folder for files

我正在尝试在 powershell 中 运行 这个查询,但是当我 运行 它与当前 $MonitorFolder 作为 \\vavm\CINICO\Incoming 我的查询在添加一个时不起作用文件到文件夹。如果我将 $MonitorFolder 的变量更改为 C:\Users\RickG\Desktop\Test Reports,我的代码在将文件添加到文件夹时工作正常。那么,当文件添加到文件夹时,我该如何监控 \vavm\CINICO\Incoming 路径。

这是我检查文件夹的第一部分代码片段:

$MonitorFolder = "\vavm\CINICO\Incoming"
$MonitorStopFile = "monitor.die"
$smtpServer = "mail.test.org"
$smtpFrom = "SYSTEMFUNCTION@test.org" 
$smtpTo = "test@test.org"


$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("\", "\\"))"'
"@

解决方案:

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

$smtpServer = "mail.test.org"
$smtpFrom = "SYSTEMFUNCTION@test.org" 
$smtpTo = "test@test.org"
$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)      
}

我 99% 确定 __InstanceCreationEvent 不支持远程共享。 WMI 事件由您的计算机触发,即使您没有任何订阅。您的计算机无法监控网络上的文件共享。

您应该尝试 System.IO.FileSystemWatcher 来监控远程共享。例如

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

$smtpServer = "mail.test.org"
$smtpFrom = "SYSTEMFUNCTION@test.org" 
$smtpTo = "test@test.org"
$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()
    }

}

更新了上面的示例,使用线程安全的全局数组列表来存储 "newfiles"-log 和 while-loop,以便在日志中有新项目时每分钟创建一封邮件。