我有这个automator脚本,它是一个处理图像的finder服务。这个想法是:
这就是我所做的:首先,AppleScript中的一个模块询问我想要的尺寸:
on run
choose from list {"100", "200", "300"} with prompt "What size(s) do you want? (multiple sizes allowed)" with multiple selections allowed
set choice to the result as string
return choice
end run
因为此服务接收图像文件,并且以下bash脚本正在接收参数列表,所以此选择变量将是第一个" $ @"。我需要在bash脚本(下一部分)开始时删除它。
这是bash脚本:
#!/bin/bash
# here is the parameters passed to the functions
# $1 path to the file to be processed
# $2 original image name
# $3 original image directory
function f100 {
sips -z 100 100 "$1" --out "$3"/"$2"_file100.png
sips -z 200 200 "$1" --out "$3"/"$2"_file100@2x.png
}
function f200 {
sips -z 200 200 "$1" --out "$3"/"$2"_file200.png
sips -z 400 400 "$1" --out "$3"/"$2"_file200@2x.png
}
function f300 {
sips -z 300 300 "$1" --out "$3"/"$2"_file300.png
sips -z 600 600 "$1" --out "$3"/"$2"_file300@2x.png
}
choice=$1
shift
for f in "$@"; do
DIRNAME="$(dirname "$f")"
filename=$(basename "$f")
name="${filename%.*}"
extension="${filename##*.}"
if [[ $choice == *"100"* ]]
then
f100 $f $filename $DIRNAME
fi
if [[ $choice == *"200"* ]]
then
f200 $f $filename $DIRNAME
fi
if [[ $choice == *"300"* ]]
then
f300 $f $filename $DIRNAME
fi
done
Applescript部分将选项作为字符串传递给脚本。所以,如果我选择100和200,它将传递一个字符串" 100200"。如果我选择所有3个选项,它将通过" 100200300",这就是为什么我在ifs上搜索子字符串并运行正确的函数。
此脚本在终端上运行良好,但在finder上作为服务安装时不执行任何操作。没有错误,没有。
答案 0 :(得分:1)
这是因为“运行Shell脚本”操作无法接收文件, AppleScript 必须返回input
,就像这样
on run {input, parameters}
choose from list {"100", "200", "300"} with prompt "What size(s) do you want? (multiple sizes allowed)" with multiple selections allowed
set beginning of input to the result as string
return input
end run
或者
on run {input, parameters}
choose from list {"100", "200", "300"} with prompt "What size(s) do you want? (multiple sizes allowed)" with multiple selections allowed
set choice to the result as string
return {choice} & input
end run
<强>更新强>
我只对路径不包含空格或特殊字符的文件进行了测试。
您必须用双引号字符括起每个变量。
function f100 {
sips -z 100 100 "$1" --out "$3"/"$2"_file100.png
sips -z 200 200 "$1" --out "$3"/"$2"_file100@2x.png
}
function f200 {
sips -z 200 200 "$1" --out "$3"/"$2"_file200.png
sips -z 400 400 "$1" --out "$3"/"$2"_file200@2x.png
}
function f300 {
sips -z 300 300 "$1" --out "$3"/"$2"_file300.png
sips -z 600 600 "$1" --out "$3"/"$2"_file300@2x.png
}
choice=$1
shift
for f in "$@"; do
DIRNAME="$(dirname "$f")"
filename=$(basename "$f")
name="${filename%.*}"
extension="${filename##*.}"
if [[ $choice == *"100"* ]]
then
f100 "$f" "$filename" "$DIRNAME"
fi
if [[ $choice == *"200"* ]]
then
f200 "$f" "$filename" "$DIRNAME"
fi
if [[ $choice == *"300"* ]]
then
f300 "$f" "$filename" "$DIRNAME"
fi
done
当服务不起作用时,您可以在 Automator 中测试服务。
在 Finder
中选择一个或两个文件在工作流程的第一个位置插入“Get Selected Finder Items
”操作。
我添加了一些echo "$some variable"
来调试shell脚本