Как передать результат из сценария оболочки на следующий шаг в Automator - PullRequest
1 голос
/ 11 июля 2019

Я использую Automator для создания службы Finder, чтобы получить длину всех выбранных видео и отобразить в диалоговом окне.

Итак, сервис будет работать так:

  1. Я выбираю кучу видео
  2. Я щелкаю правой кнопкой мыши и запускаю сервис.

Я нашел этот скрипт Bash в сети, который отлично работает.

times=()
for f in *.mov; do
    _t=$(ffmpeg -i "$f" 2>&1 | grep "Duration" | grep -o " [0-9:.]*, " | head -n1 | tr ',' ' ' | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')
    times+=("$_t")
done
echo "${times[@]}" | sed 's/ /+/g' | bc

Я пытаюсь приспособить это для автоматизатора. Итак, мой сервис до сих пор равен этому:

У меня есть первый шаг, который получает файлы фильмов из Finder и переходит к этому Run Shell Script

times=()
for f in "$@"; do
    _t=$(ffmpeg -i "$f" 2>&1 | grep "Duration" | grep -o " [0-9:.]*, " | head -n1 | tr ',' ' ' | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')
    times+=("$_t")
done
total="${times[@]}" | sed 's/ /+/g' | bc

Я был вынужден изменить цикл for на этот

for f in "$@"; do

Я так понимаю, что automator перечисляет все полученные файлы. Файлы принимаются в качестве аргументов.

Я изменил последнюю строку на

total="${times[@]}" | sed 's/ /+/g' | bc

Чтобы создать переменную с именем total, которая может содержать общее количество секунд всех видео.

Теперь мне нужно передать эту переменную на следующий шаг и отобразить ее в диалоговом окне.

Два вопроса:

  1. как мне это сделать?
  2. исправления, которые я исправил?

спасибо

1 Ответ

2 голосов
/ 11 июля 2019

Да, изменение цикла for в сценарии оболочки с:

for f in *.mov; do

на

for f in "$@"; do

является правильным.$@ - это все параметры, передаваемые сценарию оболочки, который в вашем сценарии будет путевым именем каждого выбранного файла (ов) фильма.

Теперь мне нужно передать эту переменнуюперейти к следующему шагу и отобразить его в диалоговом окне

. Для этого вам необходимо:

  1. echototal в конце сценария оболочки.Поэтому измените последнюю строку в вашем втором примере сценария оболочки на следующее:

    times=()
    for f in "$@"; do
      _t=$(ffmpeg -i "$f" 2>&1 | grep "Duration" | grep -o " [0-9:.]*, " | \
         head -n1 | tr ',' ' ' | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')
      times+=("$_t")
    done
    echo "${times[@]}" | sed 's/ /+/g' | bc   # <-- change last line to this
    
  2. Далее в Automator добавьте действие Run AppleScript после текущего Run Shell Script действие.Чтобы найти действие Run AppleScript в Automator , вы можете:

    • Выбрать Library в верхней части панели / столбца слева:

    • В поле поиска введите: Запустите AppleScript и перетащите действие Run AppleScript в область холста под текущим Run Shell Script действием.

  3. Введите следующий AppleScript во вновь добавленное действие Run AppleScript:

    on run {totalDuration}
      set dialogText to (totalDuration as text) & " seconds"
      tell application "Finder" to display dialog dialogText with title ¬
          "Total Duration" buttons {"OK"} default button 1 with icon 1
    end run
    

Пример рабочего процесса Automator:

Готовый холстобласть вашего сервиса / рабочего процесса Automator теперь должна выглядеть примерно так:

enter image description here

Примечание:

  1. У меня нет утилиты ffmpeg, доступной на Mac, который я сейчас использую, поэтому сценарий оболочки, показанный на снимке экрана выше, использует встроенную утилиту mdls длявместо этого получите продолжительность каждого хода.

    Вот этот код:

    total_duration=0
    
    for f in "$@"; do
      duration=$(mdls -name kMDItemDurationSeconds -raw -nullMarker 0 "$f")
      total_duration=$(echo "$total_duration" + "$duration" | bc)
    done
    
    echo "$total_duration"
    
  2. Другое незначительное отличие на этом скриншоте:Код, указанный в действии Run AppleScript.Это просто делает некоторое округление, которое, вероятно, не является необходимым, учитывая ваш сценарий оболочки, который вы хотите использовать.Использование AppleScript, показанного в вышеупомянутой точке № 3, должно быть в порядке.

...