2016-08-01 3 views
0

を経由してコマンドプロンプト。 起動したシェルを制御できますか?それとも他の方法もあります。コントロールウィンドウは、ように私は、コマンドプロンプトを起動していますTCL

今、私は次のように打ち上げの時にコマンドを送信しています: eval exec [auto_execok start] "cd Desktop" &

しかし、私は、さらに操作用のシェルを制御したいです。

+2

対話型CLIセッションでは、 'Expect'を使うべきです。 – Dinesh

答えて

2

(pidでできること以外は)何かの方法で起動することはできません。最後には&を使ってコントロールを全く要求していません。

一部のプログラムは、パイプラインとして起動すると多少の制御が可能です。

set pipeline [open |cmd "r+"] 
fconfigure $pipeline -buffering line -blocking 0 
puts $pipeline "dir" 
while {![fblocked $pipeline]} { 
    set line [gets $pipeline] 
    puts "I have read: $line" 
} 

エクステンションパッケージであるExpectでさらに制御できます。

ただし、コマンドプロンプトウィンドウは、これらのいずれのメカニズムでも制御できません。ウィンドウを開くほとんどのプログラムではできません。

+0

私は "&" b'cozを使用していません。私はtclプロンプトを返していません。 – Dcode

+0

はい。'exec'を'& 'なしにすると、Tclはサブプロセスが終了してから続行するのを待ちます。ターミナルプロンプトで、時間がかかるかもしれません! –

0

バッチファイルを難しい方法で再発明しようとしていると思われます。

あなたは、cmd.exeを使用して、一連のタスクを実行

set cmd [open |cmd.exe "r+"] 

を使用して、それを起動して、単純にそのストリームにあなたのバッチスクリプトを記述する必要がある場合:

puts $cmd $myscript 

説明するために:シェル(Tclの独自のtclshwishが含まれています)には通常、対話型と非対話型の2つの実行モードがあります。 fisrtは、シェルが "そのまま"起動されたときに有効になり、のときには、最初の—がパイプラインで起動されます。対話モードでは、シェルはプロンプトを表示し、対話的にコマンド—を受け入れます。 非インタラクティブモードでは、コマンドはそのstandard input streamで読み込まれ、読み込み時に実行されます。 Windowsのcmd.exeも例外ではないため、open |cmd.exeは「読み取り/書き込み」モード(r+)で、バッチコマンド言語で作成されたスクリプトをストリームオブジェクトにバインドされる標準入力ストリームに書き込みます。openが返します。

プロセスがopenまたはexecその標準エラーストリームには何も書き込まれ、および/またはゼロ以外の終了コードで終了して起動した場合、それらのコマンドは、エラー処理は主に、あなたのために覆われている(つまり、例外が発生します)。


まあは、Windowsのために、それは「非対話型」とは対何「インタラクティブ」を定義するのは難しいのですが、それは手元の質問には多少は無関係です。

関連する問題