2016-08-05 4 views
0

私は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

'$ Event'は、イベントの中ではなく、イベントの中に入れられます。 – PetSerAl

+1

外部とやり取りする場合は、actionパラメーターを使用しないでください。代わりに、Wait-EventとGet-Eventを使用して取得します。 –

答えて

1

更新例。注:私はこれを全くテストしていないので、バグがある可能性があることに注意してください。私はいくつかのコメントとコードの他のセクションのためのいくつかの異なるアプローチを追加しました。

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がどのように動作するかによって、単一の変更に対して2つのイベント通知を受け取る可能性があります(これはコードの問題ではなくWindowsの深刻な問題です)。それを試してみてください。

クリス

編集:アクションパラメータを削除するのを忘れました。それは今行ってしまった。

+0

クリスありがとう、あなたは間違いなく私にいくつかのアイデアを与えてくれた。あなたのコードは、私が受信箱にテストしたときに無限ループするようです。私はそれを修正することはできませんでした。 – Bridger

+0

私はあなたがそれを望んだと思っていました:)あなたが一度だけ起動させたいなら、 'while($ true)'ループを削除してください。そうでなければそのループから脱出する方法はありません。そうでない場合は、複数のイベントで動作するかどうかを定義する他の終了基準が必要です。 –

+0

私は、イベントがトリガーすると無限にメールを送信することを意味しました。私はそれが実行し続けたいが、無限にトリガしない。もう一度お世話になりました。あなたはこのプロジェクトをもっと簡単にしました。 – Bridger

関連する問題