2016-08-01 101 views
0

命令提示符我啓動命令提示符: eval exec [auto_execok start] &控制窗口通過TCL

它返回我的PID,並啓動命令提示符。 我可以控制啓動的shell嗎?或者還有其他方法。

現在我喜歡在推出的時間發送命令: eval exec [auto_execok start] "cd Desktop" &

但我想控制進一步的操作外殼。

+2

您應該使用'Expect'進行交互式CLI會話。 – 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,一個擴展包來完成。

但是,命令提示符窗口不能由任何一種機制控制;大多數打開Windows的程序都不能。

+0

我沒有使用「&」b'coz我沒有收到tcl提示符。 – Dcode

+0

是的。對於沒有'&'的'exec',Tcl在繼續之前等待子進程完成。使用終端提示符,可能需要一些時間! –

0

我懷疑你試圖重新創建批處理文件的困難。

如果需要使用cmd.exe執行一系列任務,產卵它使用

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

,然後簡單地編寫批處理腳本,該流:

puts $cmd $myscript 

爲了解釋:彈(Tcl的擁有tclshwish)通常有兩種執行模式:交互式和非交互式。當shell以「原樣」啓動時啓用fisrt,當它在管道中啓動時第二個— 。在交互模式下,shell將顯示其提示並交互地接受命令—。 在非交互模式下,它只會讀取其standard input stream上的命令並在讀取它們時執行它們。 Windows的cmd.exe也不例外,所以您可以在open |cmd.exe它以「讀/寫」模式(r+)並將其批處理命令語言編寫的腳本寫入其標準輸入流中,該流將綁定到流對象open返回。

如果一個進程開始openexec寫入任何東西到其標準錯誤流和/或與非零退出代碼退出,這些命令將引發一個異常(即錯誤處理主要是覆蓋了你)。


好,適用於Windows,這是很難界定什麼是「互動」與「非交互式」的意思,但它有點不相干手頭上的問題。