Ecco uno script in powershell che monitora costantemente una cartella per la presenza di nuovi file.
Quando viene rilevato un nuovo file, esso viene inviato via mail.
#compilare i seguenti campi con i valori corretti
$MonitorFolder = "C:\test"
$MonitorStopFile = "end.Mon"
$smtpServer = "mail.server.it"
$smtpFrom = "mittente@mail.it"
$smtpTo = "destinatario@mail.it"
$smtpSubject = "Nuovo file rilevato in $($MonitorFolder)."
$smtpport = "25"
$Password = "LaPassdellaMail"
$credentials = new-object Management.Automation.PSCredential $smtpFrom, ($password | ConvertTo-SecureString -AsPlainText -Force)
$SMTPMessage = @{
To = $smtpTo
From = $smtpFrom
Subject = $smtpSubject
Smtpserver = $smtpServer
port = $SMTPPort
Credential = $credentials
}
$SourceID = "MonitorFiles"
# si puo modificare il numero di secondi dopo cui controllare presenza nuovi file, in questo caso dopo scritta WITHIN abbiamo 10 che sono i secondi.
# per monitorare ogni minuto basta scrivere 60, per monitorare ogni ora occorre scrivere 3600, ogni 24 ore scrivere 86400
$Query = @"
SELECT * FROM __InstanceCreationEvent WITHIN 10
WHERE targetInstance ISA 'Cim_DirectoryContainsFile'
AND targetInstance.GroupComponent = 'Win32_Directory.Name="$($MonitorFolder.Replace("\", "\\\\"))"'
"@
Try {
$smtp = New-Object -TypeName "Net.Mail.SmtpClient" -ArgumentList $smtpServer
Register-WmiEvent -Query $Query -SourceIdentifier $SourceID
Do {
"In attesa di nuovi file in '$($MonitorFolder)'; per fermare premere <Ctrl-C> oppure crea un file chiamato '$MonitorStopFile'." | Write-Host
$FileEvent = Wait-Event -SourceIdentifier $SourceID
Remove-Event -EventIdentifier $FileEvent.EventIdentifier
$FileName = $FileEvent.SourceEventArgs.NewEvent.TargetInstance.PartComponent.Split("=", 2)[1].Trim('"').Replace("\\", "\")
If ((Split-Path -Path $FileName -Leaf) -eq $MonitorStopFile) {
$smtpBody = "[$(Get-Date -Format HH:mm:ss)]`tFile di STOP ricevuto: '$($FileName)'; arresto del monitoraggio!"
Remove-Item -Path (Join-Path -Path $MonitorFolder -ChildPath $MonitorStopFile)
$FileEvent = $Null
} Else {
$smtpBody = "[$(Get-Date -Format HH:mm:ss)]`tNuovo file arrivato: '$($FileName)'"
}
$smtpBody | Write-Host -Fore Yellow
#Send-MailMessage -SmtpServer $smtpServer -To $smtpTo -From $smtpFrom -Subject $smtpSubject -Body $smtpBody -Attachments $FileName
Send-MailMessage @SMTPMessage -Body $SMTPBody -Attachments $FileName
} While ($FileEvent)
} Catch {
$_ | Out-String | Write-Error
} Finally {
Remove-Event -SourceIdentifier $SourceID -ErrorAction SilentlyContinue
Unregister-Event -SourceIdentifier $SourceID -ErrorAction SilentlyContinue
}