$ Event.SourceEventArgs。<attribute>返回null或空对象

时间:2016-08-05 21:18:49

标签: powershell

我有一个FileSystemWatcher程序,无论何时发生事件,它都会发送一封电子邮件,通知我发生了更改的位置。

但是,$Event.SourceEventArgs.FullPath返回空,其他属性返回$null

相关代码:

Function Watch{
$global:FileChanged = $false
$folder = "\\foo\boo\here\is\folder"
$filter = "*this is the filter*"
$watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{

        IncludeSubdirectories = $true
        EnableRaisingEvents = $true
    }
# Start-Sleep -Seconds 1

Register-ObjectEvent $watcher "Changed" -Action {$global:FileChanged = $true} > $null
# Register-ObjectEvent $watcher "Created" -Action {$global:FileChanged = $true} > $null
# Register-ObjectEvent $watcher "Deleted" -Action {$global:FileChanged = $true} > $null
 # $watcher.EnableRaisingEvents = $true

while($true){

     while($global:FileChanged -eq $false){
        Start-Sleep -Milliseconds 250

    }
$global:FileChanged = $false
$paths = $Event.SourceEventArgs.FullPath 
$name = $Event.SourceEventArgs.FileName
$changetype = $Event.SourceEventArgs.ChangeType
$TimeChanged = $Event.TimeGenerated
RunScript $paths, $name, $changetype, $TimeChanged
}
}
Function RunScript
{
    param($paths, $name, $changetype, $TimeChanged)

    Write-Host "This should work $paths $name $changetype $TimeChanged"
    $From = "email"
    $ToAddress = "email"
    $MessageSubject = "Form Submitted by $paths"
    $MessageBody = "File Path: $Event.SourceEventArgs.FullPath
     Name: $name 
     Change Type?: $changetype 
     Time Changed: $timechanged"
     $SendingServer = "999.999.999.9.9"
     $SMTPMessage = New-Object System.Net.Mail.MailMessage $From, $ToAddress,
$MessageSubject, $MessageBody
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
$SMTPClient.Send($SMTPMessage)
}

Watcher

1 个答案:

答案 0 :(得分:2)

更新了示例。注意:我没有对此进行过测试,因此请注意可能存在的错误。我为代码的其他部分添加了一些注释和几种不同的方法。

Function Watch {
    $folder = "\\foo\boo\here\is\folder"
    $filter = "*this is the filter*"
    $watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
        IncludeSubdirectories = $true
        EnableRaisingEvents = $true
    }
    # Start-Sleep -Seconds 1

    Register-ObjectEvent $watcher "Changed" > $null
    # Register-ObjectEvent $watcher "Created" > $null
    # Register-ObjectEvent $watcher "Deleted" > $null
    # $watcher.EnableRaisingEvents = $true

    while($true){
        Wait-Event | Get-Event | ForEach-Object {
            # $paths = $_.SourceEventArgs.FullPath 
            # $name = $_.SourceEventArgs.FileName
            # $changetype = $_.SourceEventArgs.ChangeType
            # $TimeChanged = $_.TimeGenerated
            # If you comma-delimit this list you pass all of the arguments into "RunScript".
            # Either name the parameters or make them positional.
            # Positional:
            #   RunScript $paths $name $changetype $TimeChanged
            # Named:
            #   RunScript -Paths $paths -Name $name -ChangeType $changetype -TimeChanged $TimeChanged
            # Or use Splatting:
            $params = @{
                Paths       = $_.SourceEventArgs.FullPath
                Name        = $_.SourceEventArgs.FileName
                ChangeType  = $_.SourceEventArgs.ChangeType
                TimeChanged = $_.TimeGenerated
            }
            RunScript @params

        }
    }
}

Function RunScript {
    param($paths, $name, $changetype, $TimeChanged)

    Write-Host "This should work $paths $name $changetype $TimeChanged"
    # $From = "email"
    # $ToAddress = "email"
    # $MessageSubject = "Form Submitted by $paths"
    # $MessageBody = "File Path: $Event.SourceEventArgs.FullPath
    # Name: $name 
    # Change Type?: $changetype 
    # Time Changed: $timechanged"
    # $SendingServer = "999.999.999.9.9"
    # $SMTPMessage = New-Object System.Net.Mail.MailMessage $From, $ToAddress,
    # $MessageSubject, $MessageBody
    # $SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
    # $SMTPClient.Send($SMTPMessage)

    # Is there a reason you're not using Send-MailMessage?
    # Splatting again :)
    # The body of the email isn't going to be very pretty, but it's a start.
    $params = @{
        From = "email"
        To   = "email"
        Subject = "Form Submitted by $paths"
        Body = "File Path: $paths
        Name: $name 
        Change Type?: $changetype 
        Time Changed: $timechanged"
        "
        SmtpServer = "999.999.999.9.9"
    }
    Send-MailMessage @params


}

现在你得到一个警告。 FileSystemWatcher非常有用,但由于Windows的工作方式,您可能会收到两个针对单个更改的事件通知(这是一个深层Windows问题,而不是代码问题)。试试吧,看看。

克里斯

编辑:忘记删除操作参数。它现在已经消失了。