2009-09-18 27 views
8

Cocoaアプリケーション内で端末コマンドを実行する方法については、このスレッドを見てきました。しかし、私は実際にTerminal.appを指定されたディレクトリに立ち上げたいと思います。Cocoaアプリケーションから指定されたフォルダに端末ウィンドウを開きます。

私は次のように動作しないことを知っている:

[[NSWorkspace sharedWorkspace] openFile:folderPath withApplication:@"Terminal"]; 

ターミナルは、実際にファイルとしてフォルダを開こうとします。

これはAppleScriptを使用する必要がありますか?

アイデア?そこ平野ココアでそれを行う方法ですが、AppleScriptでは、それは

tell application "Terminal" to do script "cd ~/Desktop" 

答えて

14

あなたはこのようにココアからAppleScriptを使用することができます

NSString *s = [NSString stringWithFormat: 
    @"tell application \"Terminal\" to do script \"cd %@\"", folderPath]; 

NSAppleScript *as = [[NSAppleScript alloc] initWithSource: s]; 
[as executeAndReturnError:nil]; 

AppleScriptスクリプトはcobbalから取られました。ありがとう!

+0

完璧、ありがとう! –

+1

この使用のために多分恐らく、Scripting Bridge(http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html)は、以下を介して外部アプリと通信するための良い解決策です。 AppleScriptをObjective-Cアプリから起動します。 –

+0

フォルダには二重引用符やスペースを入れてください。 – cobbal

2

わかりません。

ターミナルディレクトリが毎回同じ場合は、実行可能な.shファイルをcdコマンドで作成し、それをopenFile引数にすることができます。

+0

ありがとう、あなたとwoofyはそれを解決しました! –

0

は、私は本当にAppleScriptを知らない些細なのですが、私はあなたがこのためにそれを使用することができるに違いない場合

0

cdコマンドを使用することを示唆している既存の回答は素晴らしいです。さらに、私は素晴らしい例のためにアプリcdtoのソースをチェックアウトすることをお勧めします。 CdtoはTerminal.appウィンドウを開いて最前面のファインダーウィンドウにcdするための高速ミニアプリケーションです。このアプリは、ファインダーウィンドウのツールバーに配置するように設計されています(アイコンを含む)。

0

あなたはTerminal.appに "DOスクリプト" イベントを送信する(現在は廃止)AppleEventの炭素APIを使用することができます。

OSStatus doTerminalScript (NSString* script) { 
    AppleEvent evt; 
    OSStatus err; 
     // Build event 
    err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript, 
          typeApplicationBundleID, "com.apple.terminal", 18L, 
          kAutoGenerateReturnID, kAnyTransactionID, &evt, NULL, 
          "'----':utf8(@)", strlen([script UTF8String]), [script UTF8String]); 
    if (err) return err; 
    AppleEvent res; 
     // Send event 
    err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout); 
    AEDisposeDesc(&evt); 
    if (err) return err; 
     // Check for any errors from Terminal.app 
    AEDesc desc; 
    err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc); 
    AEDisposeDesc(&res); 
    if (!err) { 
     AEGetDescData(&desc, &err, sizeof(err)); 
     AEDisposeDesc(&desc); 
    } else if (err == errAEDescNotFound) 
     err = noErr; 
    return err; 
} 

、フォームhereを撮影します。 実行していない場合、Terminal.appは-[NSWorkspace launchApplication:]で起動する必要があることに注意してください。 希望の場合は、- [NSApplication activateWithOptions:]

で前景に置くことができます。これは、より現代的なScripting Bridge APIに簡単に移植することができます。

関連する問題