2009-09-18 4 views
8

Bir kakao uygulamasının içinden terminal komutlarının nasıl yürütüleceği hakkında bu iş parçacığını gördüm. Ama aslında belirli bir dizine Terminal.app başlatmak istiyorum.Bir kakao uygulamasından belirtilen bir klasöre bir terminal penceresi açın

Ben şu çalışmadığını biliyoruz:

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

Terminali aslında bir dosya olarak klasörü açmak çalışır.

Bu, AppleScript'i kullanmam gereken bir şey mi?

Herhangi bir fikrin var mı? Orada düz kakao bunu yapmanın bir yolu, ama AppleScript o

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

cevap

14

:

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

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

AppleScript komut cobbal alındı. Teşekkürler dostum!

+0

mükemmel, teşekkürler! –

+1

Belki de bu kullanım için aşırı hızda olmasına rağmen, Scripting Bridge (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) üzerinden dış uygulamalarla iletişim kurmak için iyi bir çözümdür. Nesne-C uygulamaları içinden AppleScript. –

+0

, tırnak işaretleri veya boşluk içeren klasörlere dikkat edin – cobbal

2

emin değilim.

Terminal dizini her defasında aynıysa, yalnızca bir cd komutuyla yürütülebilir bir .sh dosyası oluşturabilir ve openFile argümanını hazırlayabilirsiniz. Böyle Kakao AppleScript'i olabilir

+0

Teşekkürler, sen ve woofy çözdü! –

0

Gerçekten AppleScript'i bilmiyorum oldukça önemsiz, ama bunun için kullanabiliriz bahis eğer

0

cd komutunu kullanarak var olan yanıtlar harika. Ayrıca, mükemmel bir örnek için uygulamanın cdto kaynağına gitmesini öneriyorum. Cdto, en çok bulunan pencere penceresine bir Terminal.app penceresi açan bir hızlı mini uygulamadır. Bu uygulama, bulucu penceresinin araç çubuğuna yerleştirilecek şekilde tasarlanmıştır (simgesi dahil).

0

Sen Terminal.app için bir "Do Senaryo" olayını göndermek için (artık atıl) AppleEvent Karbon API kullanabilirsiniz:

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; 
} 

formu here Taken. Terminal.app'ın, çalışmıyorsa -[NSWorkspace launchApplication:] ile başlatılması gerektiğini unutmayın. isteseydim , bir açıklama önerdiği gibi - [NSApplication activateWithOptions:]

ile ön planda konabilir, bu kolayca daha modern Scripting Bridge API taşıdık olabilir.