web-dev-qa-db-ja.com

AppleScriptアプリケーションを起動し、別のAppleScriptからシェルスクリプトを実行するにはどうすればよいですか?

これが私のファイルです:

launcher.applescript

tell application ":path:to:applescript:apps:Shell-script-launcher.app" to launch

Shell-script-launcher.app [AppleScript、アプリケーションとして保存]

 do Shell script "say starting script"

望ましい動作:

  1. AppleScriptエディタから「launcher.applescript」を実行します
  2. 「開始スクリプト」を聞く

実際の動作:

  1. Finderで「Shell-script-launcher.app」を手動で開いて実行すると、予期した動作が得られます
  2. 「launcher.applescript」を実行すると「Shell-script-launcher.app」が開きますが、シェルスクリプトは実行されません。

アプリを「実行のみ」および「開いたまま」として保存しようとしました。まだ進展なし。何がお勧めですか。最終結果は、Applescriptではなくアプリケーションでなければなりません。

9
Ryan

概念的に

  • runコマンドが起動してアプリケーションを実行します hidden
  • activateコマンドは、アプリケーションを起動、実行、および activates します(最前面のアプリケーションにします)。
  • launchAppleによる 、「まだ実行されていない場合はアプリケーションを起動しますが、実行コマンドは送信しません。」
    • appleScriptベースのアプリケーションの場合、 /ロード済みであることを意味しますが、実行されません (つまり、それらの-暗黙的または明示的-on runハンドラーは呼び出されません)しかし、実際には10.9までは当てはまりません-以下を参照してください。
    • non -AppleScriptベースのアプリケーションの正確な意味が(私には)はっきりしない

Apple thinks It is work with AppleScript-based applications 、which OSX 10.10以降でのみtrue) (ヨセミテ)

スクリプトは、他のアプリケーションと同じように、スクリプトアプリケーションにコマンドを送信できます。開いたままではないアプリケーションを起動してそのスクリプトを実行するには、次のように、起動コマンドの後に実行コマンドを使用します。

launch application "NonStayOpen"
run application "NonStayOpen"

起動コマンドは、暗黙的な実行コマンドを送信せずにスクリプトアプリケーションを起動します。 runコマンドがスクリプトアプリケーションに送信されると、スクリプトアプリケーションはコマンドを処理し、必要に応じて応答を送信して終了します。

OSX 10.8、10.9(OSX 10.10で修正済み)での動作不良:

launch単独ではアプリケーションを run するのに十分であり、確かにAppleScriptベースのアプリケーションで動作する唯一のコマンドですrunまたはactivateを実行しようとすると、(launchに加えてかどうかに関係なく)アプリケーションが実行されます-AppleScriptエディターから実行した場合でも twice でさえも実行されます(!; osascriptで1回だけ)-失敗を報告します<appName> got an error: Connection is invalid

これは私にバグとして現れます。
OSXバージョン<= 10.7の動作がわかりません。

注:launchを使用して実行されない動作を1回確認しましたが、OS X 10.9.2およびOS X 10.8.5でゼロから作成した、開いたままのAppleScriptベースのテストアプリもすべて executes launchを使用したスクリプト-ドキュメントの説明と矛盾します。

お使いのシステムの動作が異なるかどうか、および/または古いバージョンの動作を教えてください。 launchが作成されて実行されないアプリのOSXバージョンは何ですか?

OSX 10.1では、動作はドキュメントと一致していますですが、注目に値する点が1つあります。

  • 意図が起動して1ステップで実行する場合、run applicationで十分です-最初に別のlaunch applicationコマンドを使用する必要はありません。

オプション


  • @ user309603の実用的なソリューションdo Shell scriptと標準のopenユーティリティを使用して問題を回避します。これは、アプリケーションがAppleScriptベースかどうかに関係なく機能します。
do Shell script "open " & ¬
    quoted form of POSIX path of ¬
    alias ":path:to:applescript:apps:Shell-script-launcher.app"

  • あなたがアプリケーションのタイプを知っているなら、あなたは前もって呼び出しています:

    • AppleScript-basedアプリを実行するには:@ regulus6633が推奨するようにrun script fileを使用するのが最適です-これには、呼び出されたAppleScriptベースのアプリケーションがオブジェクトを呼び出し元に直接返すことができるという追加の利点があります。
run script file ":path:to:applescript:apps:Shell-script-launcher.app"

注:load script fileもあり、実際にすぐに実行せずに、スクリプトコードを load にロードするだけです。

  • nonAppleScriptアプリを実行するには:run/activateを使用して、アプリを非表示/最前面に実行します。
run application ":path:to:applescript:apps:Shell-script-launcher.app"

  • @atonusが示唆しているように、AppleScriptベースのアプリケーションでもse runエラーを無視try ... end tryで行うことができます-欠点は、検出できないことですアプリケーションの呼び出しの実際の失敗。

これを緩和するには、特定のConnection invalidエラーのみを選択的に無視します(これは、このエラーが正当に発生しないことを前提としています)[OSX 10.10では必要ありません]:

try
    run application "Macintosh HD:Applications:_Sandbox-AppleScript0.app"
on error number -609 # 'Connection is invalid' error that is spuriously reported
    # simply ignore
end try

  • 最後に、OSX <= 10.9では、単にlaunchコマンドを使用するを試すことができます(ただし、OPでは<= 10.7 OSXバージョンでの作業が原因で)機能しませんでした:
 launch application ":path:to:applescript:apps:Shell-script-launcher.app"

ただし、次の2つの理由により、これは非推奨です。

  • OSX 10.10では、Appleによってlaunchの動作が修正され、実行されなくなったため、コードをそこで実行すると中断します。
  • 通常、AppleScript以外のアプリはlaunchで呼び出されたときに実行(非表示)しますが、AppleScriptは「実行コマンドを送信せず」、「通常の起動を実行せずにアプリケーションを開くことができます」という ドキュメントによると 新しいウィンドウを開くなどの手順」-それが正確に何を意味するのかは明確ではなく、アプリケーションによってこれは異なる方法で処理されるようです。
16
mklement0

open を試しましたか?

do Shell script "open 'path/to/applescript/apps/Shell-script-launcher.app' && say starting script"
4
user309603

Applescriptには「スクリプトの実行」コマンドがあります。 applescriptsまたはapplescriptアプリケーションで動作します。デスクトップにアプリがある場合、これは機能します...

set appPath to (path to desktop as text) & "Shell-script-launcher.app"
run script file appPath
4
regulus6633

「try」キーワードの間に置きます。

try
tell application ":path:to:applescript:apps:Shell-script-launcher.app" to activate
end try
1
atonus

スクリプトをアプリケーションとして保存します。目的のスクリプトをスクリプトフォルダーに追加します(下のパスを参照)

次のように実行し、実行するスクリプトのタイプごとに変更します...

property theApplicationPath : the path to me as text <br/>
property theShellScriptPath : theApplicationPath & "Contents:Resources:Scripts:test.command"<br/>
property theShellScript : the quoted form of POSIX path of theShellScriptPath<br/>
<br/>
tell application "Terminal" to (do Shell script "/bin/bash " & theShellScript)
<br/>

ブーム、ボブはあなたの叔父さんです!少なくとも私にとっては。

1
HIram Newton

とても簡単です。通常のdo Shell script、 例えば:

do Shell script "open " & ¬
    quoted form of POSIX path of ¬
    alias ":path:to:applescript:apps:Shell-script-launcher.app"
1
Michael Sanders

これは役立つかもしれませんが、私はこの問題の専門家ではありません。この場合、二重起動の動作(Yosemiteでは、他のバージョンのOS Xを使用していません)が非常に煩わしく、掘り下げて、すでに実行されているかどうかを確認できることがわかりました。

このスクリプトは、いつでも好きなときに新しい端末を起動できるようにするためのものです。

if application "Terminal" is running then
    tell application "Terminal"
        activate
        do script ""
    end tell
else
    tell application "Terminal" to activate
end if
0
Peter Shannon