如何将 Shell 脚本的结果传递到 Automator 中的下一步
How to pass a result from a Shell Script to the next step inside Automator
我正在使用自动程序创建 Finder 服务以获取所有 selected 视频的长度并显示在对话框中。
因此,该服务将像这样工作:
- 我select一堆视频
- 我右击 运行 服务。
我在网络上找到了这个 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
的变量,它可以保存所有视频的总秒数。
现在我需要将此变量传递给下一步并将其显示在对话框中。
两个问题:
- 我该怎么做?
- 我所做的更改是否正确?
谢谢
是的,将 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
要做到这一点,您需要:
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
接下来在 Automator 中添加一个 Run AppleScript
动作在当前的 Run Shell Script
动作之后。要在 Automator 中找到 Run AppleScript
操作,您可以:
Select Library
左上方panel/column:
在搜索字段中键入:运行 AppleScript 并将 Run AppleScript
动作拖到下面的 canvas 区域您当前的 Run Shell Script
操作。
在新添加的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 区域现在应该如下所示:
注:
我目前使用的 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"
该屏幕截图的另一个细微差别是 Run AppleScript
操作中显示的代码。这只是做了一些舍入,考虑到您要使用的 shell 脚本,这可能不是必需的。使用上述第 3 点中所示的 AppleScript 应该可以。
我正在使用自动程序创建 Finder 服务以获取所有 selected 视频的长度并显示在对话框中。
因此,该服务将像这样工作:
- 我select一堆视频
- 我右击 运行 服务。
我在网络上找到了这个 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
的变量,它可以保存所有视频的总秒数。
现在我需要将此变量传递给下一步并将其显示在对话框中。
两个问题:
- 我该怎么做?
- 我所做的更改是否正确?
谢谢
是的,将 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
要做到这一点,您需要:
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
接下来在 Automator 中添加一个
Run AppleScript
动作在当前的Run Shell Script
动作之后。要在 Automator 中找到Run AppleScript
操作,您可以:Select
Library
左上方panel/column:在搜索字段中键入:运行 AppleScript 并将
Run AppleScript
动作拖到下面的 canvas 区域您当前的Run Shell Script
操作。
在新添加的
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 区域现在应该如下所示:
注:
我目前使用的 mac 上没有可用的
ffmpeg
实用程序,因此上面屏幕截图中显示的 shell 脚本使用built-inmdls
实用程序来获取每个移动的持续时间。代码如下:
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"
该屏幕截图的另一个细微差别是
Run AppleScript
操作中显示的代码。这只是做了一些舍入,考虑到您要使用的 shell 脚本,这可能不是必需的。使用上述第 3 点中所示的 AppleScript 应该可以。