如何将结果从Shell脚本传递到Automator中的下一步

时间:2019-07-11 04:14:59

标签: bash macos 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

我了解这是自动化器枚举所有接收到的文件的方式。文件将作为参数接收。

我将最后一行更改为

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

创建一个名为total的变量,该变量可以保存所有视频的总秒数。

现在,我需要将此变量传递到下一步,并将其显示在对话框中。

两个问题:

  1. 我该怎么做?
  2. 我所做的更改是否正确?

谢谢

1 个答案:

答案 0 :(得分:2)

是的,将shell脚本中的for循环从以下位置更改:

for f in *.mov; do

for f in "$@"; do

是正确的。 $@是传递给Shell脚本的所有参数,在您的方案中,这些参数将是每个选定电影文件的路径名。

  

现在我需要将此变量传递到下一步,并在对话框中显示

要实现这一目标,您需要:

    Shell脚本末尾的
  1. echo total。因此,将第二个示例Shell脚本的最后一行更改为以下内容:

    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动作。要在 Automator 中找到Run AppleScript操作,您可以:

    • 在左侧面板/列的顶部选择Library

    • 在搜索字段中键入:运行AppleScript 并将Run AppleScript动作拖到当前Run Shell Script动作下方的画布区域。

  3. 在新添加的Run AppleScript操作中输入以下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 Service /工作流的完整画布区域现在应显示为以下内容:

enter image description here

注意:

  1. 我当前正在使用的Mac上没有ffmpeg实用程序,因此上面屏幕截图中显示的shell脚本使用内置的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操作中显示的代码。这只是进行一些舍入,对于您要使用的Shell脚本,这可能是不必要的。可以使用上述第3点中显示的AppleScript。