2009-09-18 57 views
8

我已經看到這個線程介紹瞭如何從Cocoa應用程序內執行終端命令。但我想實際啓動Terminal.app到指定的目錄。從Cocoa應用程序打開指定文件夾的終端窗口

我知道下面不工作:

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

終端試圖實際打開該文件夾的文件。

這是我必須使用AppleScript的?

任何想法?

回答

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

完美,謝謝! – 2009-09-18 22:17:27

+1

儘管這種用法可能有些過分,但Scripting Bridge(http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html)是通過通過外部應用程序進行通信的一個很好的解決方案Objective-C應用程序中的AppleScript。 – 2009-09-19 02:28:09

+0

雖然 – cobbal 2009-09-19 04:40:03

2

不知道是否有一種方法可以做到這一點純可可粉,但在AppleScript的它相當瑣碎

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

謝謝,你和woofy解決了它! – 2009-09-18 22:22:49

0

我真的不知道的AppleScript,但我敢打賭,你可以用它來做這個。

如果終端目錄每次都是相同的,您可以創建一個可執行的.sh文件,其中包含一個cd命令,並將其作爲openFile參數。

0

現有的答案建議使用cd命令是很好的。此外,我建議您查看應用程序cdto的源代碼,以獲取一個很好的示例。 Cdto是一個快速的迷你應用程序,它打開一個Terminal.app窗口,並將其放在最前面的finder窗口中。這個應用程序的設計(包括它的圖標)放置在取景器窗口的工具欄中。

0

可以使用(現在已廢棄)的AppleEvent碳API發送一個 「做腳本」 事件Terminal.app:

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。 請注意,如果未運行,則必須使用-[NSWorkspace launchApplication:]啓動Terminal.app。 如果需要,它可以放在前臺與- [NSApplication activateWithOptions:]

正如評論建議,這可以很容易地移植到更現代的Scripting Bridge API

相關問題