2009-09-18 12 views
8

Widziałem ten wątek, jak wykonywać polecenia terminali z aplikacji Cocoa. Ale chcę faktycznie uruchomić Terminal.app do określonego katalogu.Otwórz okno terminala do określonego folderu z aplikacji Cocoa

wiem, że nie działa, co następuje:

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

Terminal próbuje faktycznie otworzyć folder jako plik.

Czy jest to coś, z czego muszę korzystać AppleScript?

Wszelkie pomysły?

Odpowiedz

14

Można użyć AppleScript z kakao tak:

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

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

AppleScript skrypt został zaczerpnięty z cobbal. Dzięki stary!

+0

idealne, dzięki! –

+1

Mimo że być może przesada dla tego zastosowania, Scripting Bridge (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) jest dobrym rozwiązaniem do komunikowania się z zewnętrznymi aplikacjami za pośrednictwem AppleScript z aplikacji Objective-C. –

+0

należy uważać na foldery ze znakami cudzysłowu lub spacje w nich. – cobbal

2

Nie wiem, czy istnieje sposób, aby to zrobić w zwykłym kakao, ale AppleScript jest dość trywialne

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

dzięki, Ty i Woofy rozwiązaliście to! –

0

ja naprawdę nie wiem, AppleScript, ale założę się, można użyć go do tego.

Jeśli katalog terminali jest taki sam za każdym razem, można po prostu utworzyć wykonalny plik .sh z komendą cd i wywołać w nim argument openFile.

0

Istniejące odpowiedzi sugerujące użycie polecenia cd są świetne. Dodatkowo, polecam sprawdzenie źródła do aplikacji cdto jako świetny przykład. Cdto to szybka mini aplikacja, która otwiera okno Terminal.app do okna znajdującego się najbardziej na przedzie. Ta aplikacja jest zaprojektowana (w tym jego ikona) do umieszczenia na pasku narzędzi okna wyszukiwarki.

0

Można użyć (teraz przestarzałe) API AppleEvent węgla do wysłania "do skryptu" zdarzenie 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; 
} 

Wykonano formę here. Należy pamiętać, że Terminal.app musi zostać uruchomiony z -[NSWorkspace launchApplication:], jeśli nie jest uruchomiony. W razie potrzeby można go umieścić na pierwszym planie, pod numerem - [NSApplication activateWithOptions:]

Jak sugeruje komentarz, można go łatwo przenieść do bardziej nowoczesnej wersji Scripting Bridge API.

Powiązane problemy