脚本从 Bash 但不是从 Automator 运行

Script runs from Bash but not from Automator

我有这个自动程序脚本,它是一个处理图像的查找器服务。思路是:

  1. 我select一堆图片
  2. 我右键单击并选择 Finder 服务上的脚本
  3. 脚本询问我是否要将图像转换为 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 脚本