脚本从Bash运行,但不是从Automator

时间:2016-01-05 09:53:02

标签: macos bash applescript automator

我有这个automator脚本,它是一个处理图像的finder服务。这个想法是:

  1. 我选择了一堆图片
  2. 我右键单击并选择Finder服务上的脚本
  3. 脚本会问我是否要将图像转换为100x100,200x200或300x300。我可以选择多个选项。
  4. 这就是我所做的:首先,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上作为服务安装时不执行任何操作。没有错误,没有。

1 个答案:

答案 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”操作。

检查每个操作的结果,如此图片 enter image description here

我添加了一些echo "$some variable"来调试shell脚本