none
Powershell. Отправка вновь созданных файлов на ftp RRS feed

  • Вопрос

  • Помогите плиз.

    Есть скрипт, который отправляет файлы на FTP сервер при их создании в целевой папке. 

    Проблема: файлы отправляются несколько раз.

    Вот скрипт:

    $ftpUrl = "ftp://user:pass@srv:port/dir/"
    $watchDir = "C:\1"
    $watchFilter = "*.jpg"

    function uploadFile($fullFileName)
    {
        $webclient = New-Object System.Net.WebClient
        $fileName = [system.io.path]::GetFileName($fullFileName)
        $fileUrl = $ftpUrl+$fileName
        $uri = New-Object System.Uri($fileUrl)
        try
        {
            $rc = $webclient.UploadFile($uri, $fullFileName)
        }
        catch [System.Net.WebException]
        {
            Write-Host "[ERR]: "$_
            return
        }
      Write-Host "Uploaded $fullFileName"
    }

    $watcher = New-object System.IO.FileSystemWatcher $watchDir
    $watcher.EnableRaisingEvents = $true
    $watcher.Filter = $watchFilter

    $changed = Register-ObjectEvent $watcher "Changed"  -Action {
        Write-Host $eventArgs.ChangeType, $eventArgs.Fullpath
        uploadFile $eventArgs.Fullpath
    }

    while($true) {
        echo "."
        start-sleep -s 5
    }

    14 сентября 2017 г. 16:50

Ответы

  • То же самое. Свою проблему решил другим способом.

    Я точно знаю график создания файлов и примерное время их записи (они большие, бэкапы). Поэтому я поставил таймер не пересекающийся с созданием файлов и просто беру последний созданный файл и отправляю на FTP. Использовал информацию https://social.technet.microsoft.com/Forums/ru-RU/0c6d4d22-899e-493d-8c26-70e8eac487c3/-powershell?forum=scrlangru.

    Спасибо за помощь. Всегда знал, что завязываться на события ОС Windows плохая идея, к сожалению.

    • Помечено в качестве ответа KazunEditor 15 сентября 2017 г. 5:41
    14 сентября 2017 г. 20:46

Все ответы

  • Использовать Created, тогда будут при создании, а не при изменении:
    Created

    Происходит при создании файла или каталога по заданному пути Path.

    Changed

    Происходит при изменении файла или каталога по заданному пути Path.


    • Изменено KazunEditor 14 сентября 2017 г. 16:53
    14 сентября 2017 г. 16:53
    Отвечающий
  • Спасибо. Я понял, что нужно проверять на создание, но это не исправило ситуацию. Все равно файл заливается на FTP несколько раз. Хотя вроде как должно быть событие создание файла одно, а когда копируются данные то уже только событие Changed. Или я не прав?
    14 сентября 2017 г. 18:01
  • https://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice

    You may notice in certain situations that a single creation event generates multiple Created events that are handled by your component. For example, if you use a FileSystemWatcher component to monitor the creation of new files in a directory, and then test it by using Notepad to create a file, you may see two Created events generated even though only a single file was created. This is because Notepad performs multiple file system actions during the writing process. Notepad writes to the disk in batches that create the content of the file and then the file attributes. Other applications may perform in the same manner. Because FileSystemWatcher monitors the operating system activities, all events that these applications fire will be picked up.

    Попробовать:

    $created = Register-ObjectEvent $watcher "Created"  -Action {
    	try {
    		$watcher.EnableRaisingEvents = $false
    		Write-Host $eventArgs.ChangeType, $eventArgs.Fullpath
    		uploadFile $eventArgs.Fullpath
    	}
    	finally {
    		$watcher.EnableRaisingEvents = $true
    	}
    }



    • Изменено KazunEditor 14 сентября 2017 г. 18:38
    14 сентября 2017 г. 18:36
    Отвечающий
  • Тоже самое(.

    Вот какие события возникают при создании файла из Notepad++,

    Uploaded J:\server.txt
    Uploaded J:\server.txt
    Uploaded J:\server.txt
    Uploaded J:\server.txt
    .
    Uploaded J:\server.txt
    Created J:\server.txt
    Uploaded J:\server.txt
    Created J:\server.txt
    Uploaded J:\server.txt
    Created J:\server.txt
    Uploaded J:\server.txt
    Created J:\server.txt
    Uploaded J:\server.txt
    .
    Uploaded J:\server.txt
    Created J:\server.txt
    Uploaded J:\server.txt
    Uploaded J:\server.txt


    Пробую ограничить вызов функции uploadFile. А именно 

    $created = Register-ObjectEvent $watcher "Created"  -Action {
    try {
    $watcher.EnableRaisingEvents = $false
    Write-Host $eventArgs.ChangeType, $eventArgs.Fullpath
    if ($eventArgs.ChangeType = "Created") {
                        uploadFile $eventArgs.Fullpath
                    }
    }
    finally {
    $watcher.EnableRaisingEvents = $true
    }
    }

    Но событие также выполняется 12 раз, при создании файла. Хоть файл внутри даже и пустой.

    • Изменено KuzEgen 14 сентября 2017 г. 19:20
    14 сентября 2017 г. 19:19
  • $watcher = New-object System.IO.FileSystemWatcher $watchDir
    $watcher.EnableRaisingEvents = $true
    $watcher.Filter = $watchFilter
    
    
    $lastRead = [DateTime]::MinValue
    $created = Register-ObjectEvent $watcher "Created"  -Action {
    	try {
    		$watcher.EnableRaisingEvents = $false
    		$lastWriteTime = [IO.File]::GetLastWriteTime($eventArgs.Fullpath)
    		if ($lastWriteTime -ne $lastRead)
    		{
    			Write-Host $eventArgs.ChangeType, $eventArgs.Fullpath
    			uploadFile $eventArgs.Fullpath
    			$lastRead = $lastWriteTime
    		}
    	}
    	finally {
    		$watcher.EnableRaisingEvents = $true
    	}
    }
    

    14 сентября 2017 г. 20:28
    Отвечающий
  • То же самое. Свою проблему решил другим способом.

    Я точно знаю график создания файлов и примерное время их записи (они большие, бэкапы). Поэтому я поставил таймер не пересекающийся с созданием файлов и просто беру последний созданный файл и отправляю на FTP. Использовал информацию https://social.technet.microsoft.com/Forums/ru-RU/0c6d4d22-899e-493d-8c26-70e8eac487c3/-powershell?forum=scrlangru.

    Спасибо за помощь. Всегда знал, что завязываться на события ОС Windows плохая идея, к сожалению.

    • Помечено в качестве ответа KazunEditor 15 сентября 2017 г. 5:41
    14 сентября 2017 г. 20:46