为什么这个AppleScript看起来不像预期的那样工作?

时间:2011-09-19 18:25:07

标签: osx-lion applescript service hidden-files

我正在使用automator编写服务。它会在no input中收到any application

所有这一切都是运行这个简单的脚本:

on run {input, parameters}
--FIRST BLOCK
    tell application "System Events"
        set app_name to name of the first process whose frontmost is true
    end tell
--SECOND BLOCK
    if (do shell script "defaults read com.apple.finder AppleShowAllFiles") is equal to "0" then
        do shell script "defaults write com.apple.finder AppleShowAllFiles 1"
    else
        do shell script "defaults write com.apple.finder AppleShowAllFiles 0"
    end if
--THIRD BLOCK
    do shell script "killall Finder"
    delay 0.5
--FOURTH BLOCK
    if (app_name is equal to "Finder") then
        tell application "Finder"
            activate
        end tell
    end if
end run

我会一步一步地走过它:

第一个阻止:获取当前最前端应用的名称,并将其存储在变量app_name中。

第二个块:根据其值切换隐藏文件变量。

第三个阻止:运行killall Finder重新启动Finder,使第二个阻止的切换生效。暂停0.5秒,不知何故这是必要的(不知道为什么,但没有这个,下一条指令将被忽略)。

第四块:检查变量app_name是什么。如果它等于Finder,这意味着在启动脚本时查找程序处于活动状态,从而再次激活Finder(killall Finder将其留在后台)。

问题:一切都按预期工作但一方面:在Finder中使用此服务时,Finder不会再次激活。

有人可能会争辩说第四个区块的代码肯定有问题,但我已经做了一些实验来证明一切都按预期工作:

当我将equal替换为not equal并从任何不是Finder的应用程序运行脚本时,Finder会自动激活。

因此,当Finder在前面时触发脚本时,似乎只有一个问题。

(这是服务应该做的事情:在任何应用程序中,切换Finder中隐藏文件的可见性。当Finder在前面时,它应该在执行cript之后在前面,当另一个应用程序在前面时,这个应用程序应该仍然在前面。)

我在狮子座上。

2 个答案:

答案 0 :(得分:1)

我之前也遇到过这种情况。基本上你说的是,当Finder处于最前端时,Finder并不是最重要的。这是事实,因为你说这是一个自动贩卖机服务。我相信automator的东西是由名为“Automator Runner”的应用程序运行的。实际上,只要服务运行,Automator Runner就会变得最重要。请注意,它是一个不露面的应用程序,因此您无法看到它是最前面的,但确实如此。因此,当您检查Finder是否位于最前端时,它永远不会。那有意义吗?我在运行applescripts时看到同样的事情,因为它们是使用Applescript Runner运行的。

那你怎么解决这个问题呢?这是一个想法。把它作为你的第一块,看它是否有帮助...

tell application "System Events"
    set app_name to name of the first process whose frontmost is true
    if app_name is "Automator Runner" then
        set visible of process "Automator Runner" to false
        set app_name to name of first process whose frontmost is true
    end if
end tell

注意:我不确定Automator Runner是否是最重要的流程。它可能是您的自动机操作的名称。但是你可以确定其他东西是最重要的,因为正在运行自动机器操作...所以如果我的代码不起作用那么你只需要弄清楚你的自动机器操作运行时正在运行的进程的名称并将其放入进入代码。您始终可以在代码中放置“显示对话框”,以显示最前端进程的名称。

另一个提示。一般来说,如果我可以使用QUIT命令,我不喜欢使用KILLALL命令。 Quit是专为Mac设计的,可确保优雅地停止播放。幸运的是,Finder有一个退出命令。试试第3和第4块。您会看到,如果Finder位于最前面,那么我们会激活它,使其再次位于最前面,但如果不是,那么我们启动它以便它至少再次运行但不会出现在前面。

-- quit the Finder
tell application "Finder" to quit

-- delay until the Finder quits
repeat
    try
        tell application "System Events" to get first process whose name is "Finder"
        delay 0.1
    on error
        exit repeat
    end try
end repeat

-- restart the Finder
if (app_name is equal to "Finder") then
    tell application "Finder" to activate
else
    tell application "Finder" to launch
end if

编辑: 您的步骤#2似乎不正确。你需要使用“ON”或“OFF”而不是0或1.试试这个......

if (do shell script "defaults read com.apple.finder AppleShowAllFiles") is equal to "ON" then
    do shell script "defaults write com.apple.finder AppleShowAllFiles OFF"
else
    do shell script "defaults write com.apple.finder AppleShowAllFiles ON"
end if

答案 1 :(得分:0)

@ regulus6633的脚本略有修改可在我的机器上运行:

-- restart the Finder
tell application "Finder" to launch      # always launch
if (app_name is equal to "Finder") then
  tell application "Finder" to activate  # activate separately
end if

我必须承认我并不完全确定为什么以及如何 - launchactivate命令的AppleScript文档在Finder的情况下似乎不够......