我正在启动命令提示符:
eval exec [auto_execok start] &
它返回pid,并启动命令提示符。 我可以控制发射的外壳吗?或者还有其他方式。
现在我在发布时发送命令,如:
eval exec [auto_execok start] "cd Desktop" &
但是我想控制shell进行进一步的操作。
答案 0 :(得分: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完成更多控制。
但是,命令提示符窗口不能由这些机制中的任何一个控制;大多数打开窗户的程序都不能。
答案 1 :(得分:0)
我怀疑你正在努力重新发明一个批处理文件。
如果您需要使用cmd.exe
执行一系列任务,请使用
set cmd [open |cmd.exe "r+"]
然后只需将批处理脚本写入该流:
puts $cmd $myscript
解释:shell(包括Tcl自己的tclsh
和wish
)通常有两种执行模式:交互式和非交互式。当shell按“原样”启动时启用fisrt,第二个启动时它在管道 1 中启动。在交互模式下,shell会以交互方式显示其提示并接受命令。
在非交互模式下,它只会读取standard input stream上的命令并在读取它们时执行它们。
Windows的cmd.exe
也不例外,因此您可以{读取/写入'模式open |cmd.exe
r+
并将其批处理命令语言编写的脚本写入其标准输入流它将绑定到流对象open
返回。
如果进程以open
或exec
开始向其标准错误流写入内容和/或退出时使用非零退出代码,则这些命令将引发异常(即错误处理主要由您承担)。
1 那么,对于Windows来说,定义“交互式”与“非交互式”的含义是比较困难的,但这与手头的问题有些无关。