PowerShell脚本,用于查找超过10 MB的日志文件,并在该文件夹中生成新文件时发送邮件

时间:2016-06-29 11:30:51

标签: powershell powershell-ise

我需要在文件夹中找到大小超过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'

1 个答案:

答案 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 = ""
        }
    }
}