2009-09-18 58 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

相关问题