我想每次运行tcl脚本时都隐藏Windows终端吗?

时间:2018-12-11 21:17:51

标签: tcl

我正在使用Windows 8.1,并且正在运行一个tcl脚本来检查文件之间的差异:

package require twapi
proc diff {file1 file2} {
    set f1 [open $file1 "rb"]
    set f2 [open $file2 "rb"]
    try {
        while 1 {
            if {[read $f1 4096] ne [read $f2 4096]} {
                return 0
            } elseif {[eof $f1]} {
                # The same if we got to EOF at the same time
                return [eof $f2]
            } elseif {[eof $f2]} {
                return 0
            }
        }
    } finally {
        close $f1
        close $f2
    }
}

我需要在后台运行此过程,但是每次运行它都会打开一个Windows终端。我尝试使用vbs脚本,它可以工作:

CreateObject("Wscript.Shell").Run "diff.tcl",0,True

但是我需要将参数从另一个程序传递到diff.tcl,因此以vbs脚本运行没有用。

2 个答案:

答案 0 :(得分:2)

问题

多纳尔怎么说。

具体来说,您应该安装Windows™ 设置为与tclsh.exe关联以与.tcl运行文件 扩展名。 (一种学习方法的方法 关联正在运行assoc.exe;另请参见ftype.exe

tclsh.exe(名称源自“ Tcl Sh ell”) 用所谓的“控制台子系统”编译的应用程序 标志设置为打开(特殊标头中的标志包含Windows™上可执行文件的元信息)。 当操作系统运行这样的应用程序时,它会注意到它的需要 一个控制台,因此它产生一个,然后运行该应用程序 在里面。

解决方案

  • 尝试使用Run的{​​{1}}方法 对象并传递0作为第二个参数来隐藏 创建的窗口;有关更多信息,请参见this

  • Tcl附带了另一个解释器,称为WScript.Shell (“ Wi 赋予 Sh ell”的别名) 来自wish.exe,因为它具有自动可用的Tk(已加载)。

    您可能想使用tclsh.exe显式运行脚本 并将脚本的路径名作为参数传递给它。

    您可能需要使用wish.exe作为脚本中的第一个命令来隐藏Tk创建的主窗口。

答案 1 :(得分:0)

您是否考虑过将结果输出到临时文件,并在下游查找该文件?然后,您可以使用VBS方法键入脚本。杂乱无章,但行得通。