如何在AppleScript中抑制/自动关闭错误对话框

时间:2014-03-25 16:14:12

标签: shell user-interface applescript osx-mavericks afp

我有后台进程作为登录用户运行,经常尝试挂载AFP共享来备份某些数据。如果无法安装共享,则应该忽略它。

在我的脚本中(实际上是bash)我通过AppleScript mount volume代码段挂载共享。与mountmount_afp命令相比,这似乎是使用Kerberos票证或用户钥匙串自动对相应服务器上的用户进行身份验证的唯一方法。特别是,我希望在脚本中存储密码:

try
    mount volume "afp://server/share"
on error errText number errNum
    log {errText, errNum}
end try

这通常很好,但是尽管有try ... on error块,'mount volume'命令总是会在出现错误时打开一个对话框:

enter image description here

我正在寻找:

  • 一种抑制此对话框的方法,或
  • 自动解除它的解决方案(可能涉及一些SystemEvents技巧?)或
  • 一种教授mount的方法,分别mount_afp使用Kerberos票证和用户钥匙串中的凭据,而无需提供密码。

我用谷歌搜索并尝试了几个小时,但还没有找到任何解决方案。

3 个答案:

答案 0 :(得分:2)

为蹩脚的回答道歉。我想如果你尝试这样的事情,你就不会被对话困扰(但你仍然可以让你的脚本对错误做出反应)。

(下面是一个简单版本。带有用户名/密码的mount_afp文档在这里:http://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/mount_afp.8.html

    try
        alias (POSIX file "/Volumes/yourMountedVolumeName")--hacky check for mount point
    on error
        --does not exist, so make dir
        do shell script "mkdir /Volumes/yourMountedVolumeName"
    end try

    --now use do shell to mount
    try
        do shell script "mount_afp 'afp://yourServer/yourMountedVolumeName/' /Volumes/yourMountedVolumeName"

    on error errText number errnum
        log {errText, errnum}
    end try

[以下答案不足]

其中一些可能很明显,但您需要

  1. 注意该对话框(或者,显然是成功安装)和
  2. 如果出现,请将其解雇。
  3. 我相信这样可以在不使用系统事件的情况下终止对话框... 在终端或外壳:

    killall NetAuthAgent
    

    或通过AppleScript:

    do shell script "killall NetAuthAgent"
    

    当然,在身份验证过程中你必须小心不要杀死它。

答案 1 :(得分:2)

我一直在我的mac mini媒体服务器上解决这个问题已经很久了,相信我终于有了解决方案。

我把它分成两个脚本:

第一个在空闲(而不是重复循环)上运行,并且每隔10秒调用第二个脚本来处理驱动器安装。

--------------------------------------------------------------------------------------
--"On Idle Launch Basic Drive Mounter.app"

on idle
    try
        --script loads on startup, so first we wait 5 seconds to ensure network
        delay 5
        --run the mounter script which is on the desktop
        run script file ":Users:localusername:Desktop:Basic Drive Mounter.app"

    on error errStr number errorNumber
        --listen for the apple quit command and quit
        if the errorNumber is equal to -128 then
            quit
            return 1
        --listen for the unknown error and ignore it
        else if the errorNumber is equal to -5014 then
            return 5
        else
            --all other errors are also ignored
            return 5
        end if
    end try
    --return with a wait of 5 seconds before next idle run
    return 5

end idle
--------------------------------------------------------------------------------------

第二个脚本检查网络,然后尝试使用shell挂载卷 安装。我最初使用的是一个取景器" mount volume"并且代码也作为注释存在,但我不喜欢弹出错误的对话框;即使只是一秒钟,所以我转向shell脚本。

--------------------------------------------------------------------------------------
--"Basic Drive Mounter.app"
try
    set IP_address to "xxx.xxx.xxx.xxx"

    set IP_Valid to true

    try
        do shell script ("ping -c 2 " & IP_address)
    on error
        set IP_Valid to false
    end try

    if IP_Valid then
        tell application "Finder"
            if disk "work" exists then
            else
                -->>shell script version
                try
                    do shell script "mkdir /Volumes/work"
                end try
                do shell script "mount_afp afp://xxx.xxx.xxx.xxx/work /Volumes/work/"
                --<<shell script version
                -->>finder mount volume version
                --with timeout of 1 second
                --  mount volume "afp://xxx.xxx.xxx.xxx/work"
                --end timeout
                --<<finder mount volume version
            end if
        end tell
    end if
on error
    -->>finder mount volume version
    --on error finder returns an error dialog which needs to be closed to go back and  retry
    --tell application "System Events"
    --  keystroke return
    --end tell
    --<<finder mount volume version
    return 0
end try    
--------------------------------------------------------------------------------------

并非所有这些都是我自己的代码,所以非常感谢Applecript社区和谷歌 - 记得向前付款

答案 2 :(得分:2)

要安装驱动器,请创建一个这样的苹果脚本:

self.timer?.invalidate()

然后,要关闭出现的警告消息,请使用另一个脚本:

tell application "Finder"

    try

        mount volume "afp://192.168.0.0/test"

    end try

end tell

延迟只是让消息框有机会出现,但您可能不需要它。

如果使用osacompile osascript从终端运行最后一个脚本,则需要提供对终端的辅助功能访问。