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

How to pass a result from a Shell Script to the next step inside Automator

我正在使用自动程序创建 Finder 服务以获取所有 selected 视频的长度并显示在对话框中。

因此,该服务将像这样工作:

  1. 我select一堆视频
  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 ( * 3600) + ( * 60) +  }')
    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 ( * 3600) + ( * 60) +  }')
    times+=("$_t")
done
total="${times[@]}" | sed 's/ /+/g' | bc

我被迫将 for 循环更改为此

for f in "$@"; do

我知道这是自动程序枚举所有收到的文件的方式。文件作为参数接收。

我把最后一行改成了

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

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

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

两个问题:

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

谢谢

是的,将 shell 脚本中的 for 循环更改为:

for f in *.mov; do

for f in "$@"; do

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

Now I need to pass this variable to the next step and display it on a dialog

要做到这一点,您需要:

  1. echo shell 脚本末尾的 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 ( * 3600) + ( * 60) +  }')
      times+=("$_t")
    done
    echo "${times[@]}" | sed 's/ /+/g' | bc   # <-- change last line to this
    
  2. 接下来在 Automator 中添加一个 Run AppleScript 动作在当前的 Run Shell Script 动作之后。要在 Automator 中找到 Run AppleScript 操作,您可以:

    • Select Library 左上方panel/column:

    • 在搜索字段中键入:运行 AppleScript 并将 Run AppleScript 动作拖到下面的 canvas 区域您当前的 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 工作流程示例:

Automator Service/Workflow 的已完成 canvas 区域现在应该如下所示:

注:

  1. 我目前使用的 mac 上没有可用的 ffmpeg 实用程序,因此上面屏幕截图中显示的 shell 脚本使用built-in 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 应该可以。