Скрипт Powershell не ждет файлы во входной папке, завершает работу

С помощью Google я собрал скрипт Powershell для автоматизации Handbrake.

Что оно делает:

  1. Некоторые файлы загружаются автоматически через RSS. Они помещаются в исходную папку.
  2. Скрипт Powershell запускает Handbrake, начинается кодирование и успешно завершается.
  3. Если в исходную папку не поступают новые файлы, сценарий завершает работу.

Проблема с последним пунктом. Когда исходная папка пуста, сценарий Powershell завершает работу, но я хочу, чтобы он продолжал работать и обрабатывал больше файлов по мере их поступления, пока я не убью его. Когда новый файл добавляется, он должен автоматически начать кодирование.

Код находится в PasteBin, в котором больше комментариев, но по нему легко понять, что делает скрипт:

$inputpath = "I:\S"
$outputpath = "I:\E"

$movies = ls $inputpath

foreach($movie in $movies){
    $name = $movie.basename

    if(!(test-path -path "$outputpath\$name.mkv")){
        C:\"Program Files"\handbrake\HandBrakeCLI.exe -i "$inputpath\$movie" -o "$outputpath\$name.mkv" `
        -e x264 -b 1000 -2 -T -a 1,1 -E mp3 -B 112 --mixdown stereo -f mkv --detelecine --decomb `
        --loose-anamorphic -m -x rc-lookahead=30:ref=4:bframes=3:me=umh:subme=9:analyse=none:deblock=1:0:0:8x8dct=1
    }
}

person Arnav Attri    schedule 23.12.2014    source источник
comment
Итак, вы просто ищете логику, которая объясняет, когда папка пуста? Может работать лучше, если вы покажете нам код, с которым у вас возникли проблемы.   -  person Matt    schedule 23.12.2014
comment
Я вижу ваш код, но не понимаю вашей проблемы. Если исходная папка пуста, обрабатывать нечего, поэтому скрипт работает корректно. Что вы хотите, чтобы произошло?   -  person Matt    schedule 23.12.2014
comment
Да, дело в том, что если исходная папка пуста, он выходит! Я не хочу, чтобы он закрывался, так как в это время исходные файлы загружаются с приватного трекера! Когда новый файл добавлен, он должен автоматически начать кодирование, но, как мы знаем, оно завершается после того, как исходная папка опустеет! Я просто хочу, чтобы он продолжал работать, даже если исходная папка станет пустой, а затем начнет обработку, как только НОВЫЙ файл будет получен в исходной папке.   -  person Arnav Attri    schedule 23.12.2014


Ответы (1)


В своих комментариях вы описываете System.IO.FileSystemWatcher и Register-ObjectEvent для использования в качестве наблюдателя за файлами. Никогда не играл с ним до сих пор, но вот пример того, что вы ищете.

$inputpath = "I:\S" 
$outputpath = "I:\E"

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $searchPath
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

$created = Register-ObjectEvent $watcher "Created" -Action {
    $name = $eventArgs.basename

    if(!(test-path -path "$outputpath\$name.mkv")){
        C:\"Program Files"\handbrake\HandBrakeCLI.exe -i "$($eventArgs.FullName)" -o "$outputpath\$name.mkv" `
        -e x264 -b 1000 -2 -T -a 1,1 -E mp3 -B 112 --mixdown stereo -f mkv --detelecine --decomb `
        --loose-anamorphic -m -x rc-lookahead=30:ref=4:bframes=3:me=umh:subme=9:analyse=none:deblock=1:0:0:8x8dct=1
    }    
}

На основе сообщения на форуме здесь. Поиск System.IO.FileSystemWatcher и Register-ObjectEvent может дать вам больше контекста. Также вам может понадобиться проверить код ручного тормоза, так как он выглядел неправильно в вашем pastebin, и я попытался улучшить его для удобочитаемости.

person Matt    schedule 23.12.2014