2012-03-08 8 views
0

ターミナルアプリケーションが開いていない場合、次のコードは2つのターミナルウィンドウを開きます。なぜこれをやっているのですか?私は1つのウィンドウを開くだけです。2つのターミナルウィンドウをNSAppleScriptで開くのはなぜですか?

ターミナルウィンドウが1つだけ開いている場合、次のコードは1つの追加ウィンドウしか開きません。

NSAppleScript* terminal = [[NSAppleScript alloc] initWithSource: 
          [NSString stringWithFormat: 
           @"tell application \"Terminal\"\n" 
           @" activate\n" 
           @" do script \"echo %@\"\n" 
           @" tell the front window\n" 
           @" set title displays shell path to false\n" 
           @" set title displays custom title to true\n" 
           @" set custom title to \"My session! %@\"\n" 
           @" end tell\n" 
           @"end tell", name, name]]; 

[terminal executeAndReturnError:nil]; 
+0

あなたは2ターミナル「アプリケーション」を言うとき、あなたは2つのターミナルウィンドウまたはアプリケーションの2つの実際のインスタンスを意味していますか? – zmccord

+0

2つのウィンドウ - ピックアップのおかげで – Coderama

答えて

1

do scriptコマンドは、常に新しいウィンドウで実行されます。特定のウィンドウで実行する場合は、次の形式を使用してください:do script (...) in (window...)。端末のin構文では、タブでスクリプトを実行することもできます。

たとえば、最前面のウィンドウでスクリプトを実行する場合は、do script "echo Hello, world!" in front windowと書くことができます。


編集:あなたは、常にウィンドウでスクリプトを実行したい場合は、フォローアップする(何も開いていない場合は、新しいものを作成する)は、次のAppleScriptを使用することができます。

tell application "Terminal" 
    activate 
    if length of (get every window) is 0 then 
     tell application "System Events" to tell process "Terminal" to click menu item "New Window" of menu "File" of menu bar 1 
    end if 
    do script "echo Hello, world!" in front window 
end tell 

もちろん、NSArrayで正しくエスケープする必要がありますが、できることは間違いありません。ここで

+0

私は 'echo'コマンドを常に新しいウィンドウで実行したいと思います。問題は、開いているウィンドウがない場合、スクリプトは1つではなく2つのウィンドウを開きます。 – Coderama

+0

@Coderama私の編集を参照してください。 –

+0

素敵な仕事!私は別の方法でそれについて行って、 'それが実行されている場合'をした – Coderama

0

は、と比較するための私のソリューションです:

tell application "Terminal" 
    if it is running then 
     do script "echo %@" 
    else 
     activate 
     do script "echo %@" in front window 
    end if 
    tell the front window 
     set title displays shell path to false 
     set title displays custom title to true 
     set custom title to "My Terminal!" 
    end tell 
end tell 
+0

ターミナルが開いていなくてもウィンドウが開いていないと、私の解決策はうまくいきません。 – Coderama

+1

うん。 'activate'は、実行中であることを保証し、フォアグラウンドで('実行中の場合 'を置き換えて)、残りは少なくとも1つのウィンドウが開いていることを保証します。 –