如何将一个复杂的AppleScript转换成一行命令以在终端中运行?

3

我有一个复杂的AppleScript,由于某些原因必须作为单行命令执行。我的脚本如下:

tell application "Finder"
    tell disk "'myDiskName'"
        open
        set current view of container window to icon view
        set toolbar visible of container window to false
        set statusbar visible of container window to false
        set the bounds of container window to {400, 100, 968, 421}
        close
        open
        eject
    end tell
end tell

我会使用终端来执行脚本,方法如下:

echo '<SCRIPT>' | osascript

这里的 是上面的多行脚本 - 这是完全正常的。现在,更具体地说,我想要使用ant任务来运行此脚本,例如:

<exec executable="echo">
    <arg line="'<SCRIPT>' | osascript" />
</exec>

由于 是多行的,它在某种程度上被忽略/未执行,但也不会抛出异常。我看到两个解决方案:一个是单行命令,这是首选;另一个是独立的AppleScript脚本,可以被调用。问题在于:上面的脚本需要一些动态变量,这些变量必须从antscript在运行时生成 - 因此,在飞行中创建脚本可能不是一个选项。

2个回答

7
我不确定什么是“ant-task”,但要创建一个一行代码,可以这样做...
/usr/bin/osascript -e "tell application \"Finder\"" -e "tell disk \"'myDiskName'\"" -e "open" -e...

换句话说,每一行的前面都有一个“-e”,而您希望将该行引用。

对我来说有效。请注意,引号转义可能对某些shell(如csh)无效。 - Kelvin
运行正常。@gamma,问题出在哪里? - pje
@pje 我猜它对于某些用例很方便。我想当我在2010年测试它时,可能犯了某种错误。然而,我仍然认为它完全无法阅读。自从采纳了这个解决方案以来,一直运行得很好。 - gamma

6
如果AppleScript应直接嵌入Ant构建脚本中,则最易读的解决方案是将脚本包装在 CDATA部分中。
然后,您可以定义一个Ant宏,将脚本数据通过其参数传递给任务:
<project name="AppleScript" default="applescript">

    <macrodef name="applescript">
        <text name="text.script" trim="false" optional="false" />
        <sequential>
            <exec executable="/usr/bin/osascript" inputstring="@{text.script}" />
        </sequential>
    </macrodef>

    <target name="applescript">
        <applescript>
            <![CDATA[
tell application "Finder"
    open startup disk
end tell
            ]]>
        </applescript>
    </target>

</project>

我非常喜欢那个答案。它简单易用,可重复使用,并且语义非常好。谢谢。 - gamma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接