0

ファイルを監視し、変更などのイベントをトリガーするスクリプトがあります。私が処理する必要がある同じファイル(前のStackflowの質問)に対してトリガーされる重複イベントがあることを除いて、それは機能します。ファイル名をログファイルに書き込み、そこにない場合にのみ再ログします。

問題は、イベントが同期的に発生していると思われ、dup をチェックしているにもかかわらず、1 つのファイル変更に対してログに 2 つのエントリを取得していることです。これを回避する方法がわかりません。

コードは次のとおりです。

Unregister-Event FW*

$source = 'S:\FIS-BIC Reporting\Report Output Files\IT\'
$filter = '*.*'
$MasterFile = "H:\PS\EmailNotifications.csv"
$LogFile = "H:\EmailNotify.log"

$FilesToCheck = import-csv -path $Masterfile 

if (! (Test-Path $Logfile))
{
$Output =  "Date|Filename|FilenameSpec|Email"
$Output | Out-File $LogFile 
}

function Get-CharRight($str,$chars)
{
 return $str.Substring($str.Length – $chars, $chars)
}

function ProcessFile()
{
param ([string]$filename)

Write-Host "file: $filename"

$ext= (Get-CharRight $filename 3)

if ($ext -ne "tmp")
{
  foreach($FileToCheck in $FilesToCheck)
    {
        if($filename  -like $FileToCheck.FilenameSpec)
            {
               Write-Host "Match"
               #check log to see if an email was already sent
                $Exists = import-csv -path $Logfile -delimiter "|"  | where-object {$_.Filename -eq $filename} 

                Write-Host ($Exists.Count -eq $null)

                if ($Exists.Count -eq $null)
                    {            
                    Write-Host "Not in logfile"        
                    $Date = Get-Date -format G
                    $Output = $Date + "|" + $filename + "|" + $FileToCheck.FilenameSpec + "|" + $FileToCheck.Email
                    $Output | Out-File $LogFile -append    

                    }
                    else
                    {write-host "duplicate"}
            }
    }
}
}

    $fsw = New-Object IO.FileSystemWatcher $source, $filter -Property @{IncludeSubdirectories = $true; NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite, Attributes'}
Register-ObjectEvent $fsw Changed -SourceIdentifier FWFileChanged -Action {
ProcessFile $Event.SourceEventArgs.FullPath 
}

Register-ObjectEvent $fsw Created -SourceIdentifier FWFileCreated -Action {
ProcessFile $Event.SourceEventArgs.FullPath 
}

while($true) {
  start-sleep -s 2
}

`

4

0 に答える 0