none
Помогите допилить скрипт RRS feed

  • Вопрос

  • Пытаюсь сделать скрипт для обработки jpg, смысл его в том, чтобы он мониторил папку на наличие новых файлов, обрабатывал их и закидывал в другую папку. Если в папку помещаешь один файл все работает, но если два и больше, то обрабатывает  только один файл. В чем косяк?

    cls
    # Каталог, в котором будем следить за файлами
    $Path = "c:\in"
    # Каталог, куда падает обработанный файл
    $PathOut="c:\out"
    # Таймаут (в мс.)
    $Timeout = 1
    
    # Создаём объект, который будет следить за возникновением события
    $Watcher = New-Object System.IO.FileSystemWatcher
    
    # Задаём путь к каталогу, за которым нужно следить
    $Watcher.Path = $Path
    $Watcher.IncludeSubdirectories = 1
    
    # При необходимости задаём фильтр
    $Watcher.Filter = "*.jpg"
    do
    {
        $Result = $Watcher.WaitForChanged("created", $Timeout)
    
        # Значение true, если время ожидания метода WaitForChanged истекло;
        # в противном случае — значение false.
        if ($Result.TimedOut -eq $false)
        {
    
    # Полный путь к результату выборки с именем файла
            $FullPath=$Path+"\"+$Result.Name
            
    # Путь без имени файла       
          $CutePath=[System.IO.Path]::GetDirectoryName($Result.Name)
    # Путь к папке назначения
          $fullPathOut=$PathOut+"\"+$CutePath
    # Запуск обработки файла
    
    c:\jpegoptim.exe $FullPath -m10
    
    # Если в папке назначения нет подкаталога то
    
            if (!(test-path $fullPathOut))            
            {            
                #...создаём его            
                new-item -type directory $fullPathOut -force            
            }            
            #Копируем файл в новое место с выводом информации на экран            
            copy $FullPath $fullPathOut -verbose      
            
      #    Stop-Transcript
        }
    }
    until ([System.Console]::KeyAvailable)

    14 октября 2016 г. 10:18

Ответы

  • $Path = "c:\in"
    $PathOut="c:\out"  
    		
    $fsw = New-Object IO.FileSystemWatcher $Path, "*.jpg" -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 
    Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    	$FullPath = $Event.SourceArgs[-1].FullPath 
    	c:\jpegoptim.exe $FullPath -m10
    	copy $FullPath $PathOut="c:\out"
    } 

    14 октября 2016 г. 10:39
    Отвечающий

Все ответы

  • $Path = "c:\in"
    $PathOut="c:\out"  
    		
    $fsw = New-Object IO.FileSystemWatcher $Path, "*.jpg" -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 
    Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    	$FullPath = $Event.SourceArgs[-1].FullPath 
    	c:\jpegoptim.exe $FullPath -m10
    	copy $FullPath $PathOut="c:\out"
    } 

    14 октября 2016 г. 10:39
    Отвечающий
  • Register-ObjectEvent : Не удалось подписаться на указанное событие. Подписчик с идентификатором источника "FileCreated" уже сущ
    ествует.
    строка:5 знак:1
    + Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (System.IO.FileSystemWatcher:FileSystemWatcher) [Register-ObjectEvent], Argumen 
       tException
        + FullyQualifiedErrorId : SUBSCRIBER_EXISTS,Microsoft.PowerShell.Commands.RegisterObjectEventCommand
    14 октября 2016 г. 11:08
  • Перезапустить консоль PowerShell и выполнить повторно. Либо удалить:

    Get-EventSubscriber | Unregister-Event

    14 октября 2016 г. 11:11
    Отвечающий
  • Да, можно и так, но предложеный вариант все-равно не работает.
    14 октября 2016 г. 11:43
  • Все отрабатывает, как нужно:
    14 октября 2016 г. 11:47
    Отвечающий
  • Извините, действительно работает. Сначала не обрабатывал почему-то. Спасибо!
    14 октября 2016 г. 12:34