2

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

2番目のブロック:値に応じて、隠しファイルと隠しファイルの変数をオンまたはオフに切り替えます。

3番目のブロック:実行killall FinderしてFinderを再起動し、2番目のブロックからの切り替えを有効にします。秒を一時停止0.5します。どういうわけかこれが必要です(理由はわかりませんが、これがないと次の命令は無視されます)。

4番目のブロック:変数app_nameが何であったかを確認します。これが等しい場合Finderは、スクリプトが開始されたときにファインダーがアクティブであったことを意味します。したがって、ファインダーをもう一度アクティブにします(killall Finderバックグラウンドのままにします)。

問題:すべてが期待どおりに機能しますが、1つは、Finderでこのサービスを使用すると、Finderが再度アクティブ化されないことです。

4番目のブロックのコードに何か問題があるはずだと主張する人もいるかもしれませんが、すべてが期待どおりに機能することを示すために少し実験しました。

Finder以外のアプリに置き換えequalnot equalスクリプトを実行すると、Finderは正常にアクティブ化されます。

したがって、Finderが前面にあるときにスクリプトが起動された場合にのみ問題が発生するようです。

(これはサービスが行うべきことです:任意のアプリ内から、Finderで隠しファイルの表示を切り替えます。Finderが前面にある場合、クリプトの実行後に前面にある必要があります。別のアプリが前面にある場合、このアプリは前面にある必要があります。まだ前にあるはずです。)

私はライオンにいます。

4

2 に答える 2

1

私も以前にこれに出くわしました。基本的に、これがFinderが最前面にあるときに実行されると、Finderは実際には最前面ではないと言っています。これはオートマターサービスだとおっしゃっていたので、それは真実です。automatorのものは「AutomatorRunner」という名前のアプリケーションによって実行されていると思います。したがって、実際には、サービスが実行されるとすぐにAutomatorRunnerが最前面になります。これは顔のないアプリケーションであるため、最前面にあることはわかりませんが、そうであることに注意してください。したがって、Finderが最前面にあるかどうかを確認すると、最前面にあることはありません。それは理にかなっていますか?Applescript Runnerを使用して実行されているため、AppleScriptを実行しても同じことがわかります。

では、これをどのように修正しますか?ここに考えがあります。これを最初のブロックにして、役立つかどうかを確認してください...

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

注:AutomatorRunnerが最前線のプロセスになるかどうかはわかりません。それはあなたのオートマトンアクションの名前のようなものかもしれません。しかし、オートマターアクションが実行されているため、他の何かが最前線にあることを確信できます...したがって、私のコードが機能しない場合は、オートマターアクションが実行されているときに実行されているプロセスの名前を把握し、それを配置する必要がありますコードに。コードにいつでも「表示ダイアログ」を配置して、最前面のプロセスの名前を表示できます。

もう1つのヒント。一般に、代わりに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が間違っているようです。0または1の代わりに「ON」または「OFF」を使用する必要があります。これを試してください...

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
于 2011-09-19T21:31:33.900 に答える
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

その理由と方法について完全には確信が持てないことを認めなければなりません – Finder の場合、launchコマンドとactivateコマンドに関する AppleScript ドキュメントは適切ではないようです…</p>

于 2011-10-20T22:49:51.727 に答える