我需要在文件夹中找到大小超过10 MB的新文件,然后发送一个包含文件名的邮件。
棘手的部分:当文件夹中有新文件到达时应发送邮件,因此我必须始终跟踪并区分旧文件和新文件。
问题:我编写了以下代码,无法构建邮件逻辑。如何识别新文件并触发邮件?
$namearray = @()
$n = gci 'C:\Users\RF\local\ReuseLibrary\FamilySaveDirectory' | % {get-item $.FullName| ? { $.length -gt 10mb }}
foreach($a in $n) {
$namearray += $a.name
}
$namearray
Send-MailMessage -To *@gmail.com -From '****@*.com' -Subject "Add User for $namearray NX License" -Body "Script execute $namearray successfully.." -SmtpServer 'mail.****.de'
答案 0 :(得分:0)
正如评论中已经指出的那样,您可以使用FileSystemWatcher
对象来监控文件系统。它比使用对象更棘手,因为你还需要能够获取文件夹中已有的文件,而不仅仅是新创建的文件。
每次在$namearray
中有新项目时,脚本是否真的会触发邮件?也许你会收到大量的电子邮件。
最好使用函数而不是脚本来执行任务,因为您具有更大的灵活性,因此您只能检查新创建的文件以及文件夹中的所有文件。
请尝试该功能。我无法很好地测试它,因为我没有一个文件夹可以随时创建10 MB大文件。
<强>用法:强>
要获取所有文件(过滤器中的通配符*很重要!):
Get-Files -filter '*.txt' -folder 'C:\yourfolder' -AllFiles
仅监控新创建的文件:
Get-Files -filter '*.txt' -folder 'C:\yourfolder' -NewFiles
<强>功能:强>
请修改Send-MailMessage
部分,以便您收到帐户中的邮件。
function Get-Files() {
param(
[string]$filter,
[string]$folder,
[Parameter(ParameterSetName='AllFiles')]
[switch]$AllFiles,
[Parameter(ParameterSetName='NewFiles')]
[switch]$NewFiles
)
# Preparing the Name array
[string[]]$namearray = @()
if(!$NewFiles.IsPresent) {
# Getting all files which are already inside the
# folder and more than 10 MB
$files = gci $folder | % { get-item $_.FullName |
? { $_.length -gt 10mb -and $_.Extension -like $filter} } |
% { $namearray += $_.FullName }
# Send E-Mail
$secondnamearray = $namearray | out-string
Send-MailMessage -To '*@gmail.com' -From '****@*.com' -Subject "Add User for NameArray NX License" -Body $secondnamearray -SmtpServer 'mail.****.de'
$namearray = ""
}
# Monitoring of the Files
$monitoring = New-Object System.IO.FileSystemWatcher
$monitoring.Filter = $filter
$monitoring.path = $folder
$monitoring.EnableRaisingEvents = $true
$event = Register-ObjectEvent -InputObject $monitoring -EventName Created -Action {
# Checking for filesize
$x = (get-item $eventArgs.FullPath).length / 10mb
if ($x -ge 1) {
Write-Host "New Item found: $($eventArgs.FullPath). Sending E-Mail!"
$namearray += $eventArgs.FullPath
$newnamearray = $namearray | out-string
Send-MailMessage -To '*@gmail.com' -From '****@*.com' -Subject "Add User for NameArray NX License" -Body $newnamearray -SmtpServer 'mail.****.de'
$namearray = ""
}
}
}