gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:10:09 29 4
gpt4 key购买 nike

我正在使用 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. 我所做的更改是否正确?

谢谢

最佳答案

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

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

    • 在搜索字段中键入:Run AppleScript 并将Run AppleScript 操作拖到当前Run Shell Script 下面的 Canvas 区域中> 行动。

  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 服务/工作流的完整 Canvas 区域现在应该如下所示:

enter image description here

注意:

  1. 我目前使用的 mac 上没有可用的 ffmpeg 实用程序,因此上面屏幕截图中显示的 shell 脚本使用内置的 mdls实用程序来获取每个 Action 的持续时间。

    这是代码:

    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 应该没问题。

关于bash - 如何将结果从 Shell 脚本传递到 Automator 中的下一步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56981549/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com