代码之家  ›  专栏  ›  技术社区  ›  Corey Floyd

从Cocoa应用程序打开到指定文件夹的终端窗口

  •  8
  • Corey Floyd  · 技术社区  · 15 年前

    我已经看过这个关于如何在cocoa应用程序中执行终端命令的线程。但我想实际将terminal.app启动到指定的目录。

    我知道以下方法不起作用:

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

    终端尝试将文件夹实际作为文件打开。

    这是我必须用applescript做的吗?

    有什么想法吗?

    5 回复  |  直到 9 年前
        1
  •  14
  •   Woofy    15 年前

    您可以使用来自Cocoa的applescript,如下所示:

    NSString *s = [NSString stringWithFormat:
         @"tell application \"Terminal\" to do script \"cd %@\"", folderPath];
    
    NSAppleScript *as = [[NSAppleScript alloc] initWithSource: s];
    [as executeAndReturnError:nil];
    

    AppScript脚本取自科巴尔。谢谢伙伴!

        2
  •  2
  •   cobbal    15 年前

    不确定是否有办法用纯可可粉来做,但在applescript中这是相当微不足道的。

    tell application "Terminal" to do script "cd ~/Desktop"
    
        3
  •  0
  •   phoebus    15 年前

    我不太了解applescript,但我打赌你可以用它来做这个。

    如果终端目录每次都是相同的,您可以使用 cd 命令并使其成为openfile参数。

        4
  •  0
  •   Joey Hagedorn    15 年前

    现有的答案建议使用 cd 指挥棒极了。另外,我建议您查看应用程序的源代码 cdto 一个很好的例子。cd to是一个快速的迷你应用程序,它可以打开一个terminal.app窗口,cd'd位于最前面的finder窗口。这个应用程序被设计(包括它的图标)放置在Finder窗口的工具栏中。

        5
  •  0
  •   Félix Faisant    9 年前

    您可以使用(现在过时的)Apple EnguleCaseAPI向Terminal.app发送“DO脚本”事件:

    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:] 如果不跑。 如果需要,可以把它放在前台。 - [NSApplication activateWithOptions:]

    正如评论所暗示的,这很容易被移植到更现代的地方。 Scripting Bridge API .