脚本从 Bash 但不是从 Automator 运行
Script runs from Bash but not from Automator
我有这个自动程序脚本,它是一个处理图像的查找器服务。思路是:
- 我select一堆图片
- 我右键单击并选择 Finder 服务上的脚本
- 脚本询问我是否要将图像转换为 100x100、200x200 或 300x300。我可以选择多个选项。
这是我所做的:首先,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
# path to the file to be processed
# original image name
# original image directory
function f100 {
sips -z 100 100 "" --out ""/""_file100.png
sips -z 200 200 "" --out ""/""_file100@2x.png
}
function f200 {
sips -z 200 200 "" --out ""/""_file200.png
sips -z 400 400 "" --out ""/""_file200@2x.png
}
function f300 {
sips -z 300 300 "" --out ""/""_file300.png
sips -z 600 600 "" --out ""/""_file300@2x.png
}
choice=
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 上时不执行任何操作。没有错误,什么都没有。
这是因为“运行 Shell Script”动作没有收到文件,AppleScript 必须 return 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 "" --out ""/""_file100.png
sips -z 200 200 "" --out ""/""_file100@2x.png
}
function f200 {
sips -z 200 200 "" --out ""/""_file200.png
sips -z 400 400 "" --out ""/""_file200@2x.png
}
function f300 {
sips -z 300 300 "" --out ""/""_file300.png
sips -z 600 600 "" --out ""/""_file300@2x.png
}
choice=
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 中测试服务。
Select Finder
中的一个或两个文件
在工作流的第一个位置插入“Get Selected Finder Items
”操作。
检查每个动作的结果,就像这张图
我添加了一些 echo "$some variable"
来调试 shell 脚本
我有这个自动程序脚本,它是一个处理图像的查找器服务。思路是:
- 我select一堆图片
- 我右键单击并选择 Finder 服务上的脚本
- 脚本询问我是否要将图像转换为 100x100、200x200 或 300x300。我可以选择多个选项。
这是我所做的:首先,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
# path to the file to be processed
# original image name
# original image directory
function f100 {
sips -z 100 100 "" --out ""/""_file100.png
sips -z 200 200 "" --out ""/""_file100@2x.png
}
function f200 {
sips -z 200 200 "" --out ""/""_file200.png
sips -z 400 400 "" --out ""/""_file200@2x.png
}
function f300 {
sips -z 300 300 "" --out ""/""_file300.png
sips -z 600 600 "" --out ""/""_file300@2x.png
}
choice=
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 上时不执行任何操作。没有错误,什么都没有。
这是因为“运行 Shell Script”动作没有收到文件,AppleScript 必须 return 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 "" --out ""/""_file100.png
sips -z 200 200 "" --out ""/""_file100@2x.png
}
function f200 {
sips -z 200 200 "" --out ""/""_file200.png
sips -z 400 400 "" --out ""/""_file200@2x.png
}
function f300 {
sips -z 300 300 "" --out ""/""_file300.png
sips -z 600 600 "" --out ""/""_file300@2x.png
}
choice=
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 中测试服务。
Select Finder
中的一个或两个文件在工作流的第一个位置插入“Get Selected Finder Items
”操作。
检查每个动作的结果,就像这张图
我添加了一些 echo "$some variable"
来调试 shell 脚本